Files
@ r14642:03d1a1f40787
Branch filter:
Location: cpp/openttd-patchpack/source/src/core/enum_type.hpp - annotation
r14642:03d1a1f40787
6.6 KiB
text/x-c++hdr
(svn r19231) -Feature: Allow overbuilding of road stops.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 | r8100:d1eb5523ede7 r8100:d1eb5523ede7 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r11356:ae9277304002 r11356:ae9277304002 r11356:ae9277304002 r11356:ae9277304002 r11356:ae9277304002 r11356:ae9277304002 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r9575:665324c39b56 r10699:4939ee218211 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r9659:f5984e9c0ecd r9659:f5984e9c0ecd r9659:f5984e9c0ecd r9659:f5984e9c0ecd r9659:f5984e9c0ecd r9659:f5984e9c0ecd r9659:f5984e9c0ecd r9659:f5984e9c0ecd r9659:f5984e9c0ecd r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r8100:d1eb5523ede7 r10699:4939ee218211 r10699:4939ee218211 r10699:4939ee218211 r10699:4939ee218211 r10699:4939ee218211 r10699:4939ee218211 r10699:4939ee218211 r10699:4939ee218211 r10699:4939ee218211 r10699:4939ee218211 r10699:4939ee218211 r10699:4939ee218211 r10699:4939ee218211 r10699:4939ee218211 r10699:4939ee218211 r10699:4939ee218211 r10699:4939ee218211 r10699:4939ee218211 r10699:4939ee218211 r10699:4939ee218211 r10699:4939ee218211 r10699:4939ee218211 r10699:4939ee218211 r10699:4939ee218211 r10699:4939ee218211 r12309:02ac22c76734 r12309:02ac22c76734 r12309:02ac22c76734 r12309:02ac22c76734 r12309:02ac22c76734 r12309:02ac22c76734 r12309:02ac22c76734 r12309:02ac22c76734 r12309:02ac22c76734 r12309:02ac22c76734 r12309:02ac22c76734 r12309:02ac22c76734 r12309:02ac22c76734 r12309:02ac22c76734 r10699:4939ee218211 r10699:4939ee218211 r10699:4939ee218211 | /* $Id$ */
/*
* This file is part of OpenTTD.
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file enum_type.hpp Type (helpers) for enums */
#ifndef ENUM_TYPE_HPP
#define ENUM_TYPE_HPP
/** Some enums need to have allowed incrementing (i.e. StationClassID) */
#define DECLARE_POSTFIX_INCREMENT(type) \
FORCEINLINE type operator ++(type& e, int) \
{ \
type e_org = e; \
e = (type)((int)e + 1); \
return e_org; \
} \
FORCEINLINE type operator --(type& e, int) \
{ \
type e_org = e; \
e = (type)((int)e - 1); \
return e_org; \
}
/** Operators to allow to work with enum as with type safe bit set in C++ */
# define DECLARE_ENUM_AS_BIT_SET(mask_t) \
FORCEINLINE mask_t operator | (mask_t m1, mask_t m2) {return (mask_t)((int)m1 | m2);} \
FORCEINLINE mask_t operator & (mask_t m1, mask_t m2) {return (mask_t)((int)m1 & m2);} \
FORCEINLINE mask_t operator ^ (mask_t m1, mask_t m2) {return (mask_t)((int)m1 ^ m2);} \
FORCEINLINE mask_t& operator |= (mask_t& m1, mask_t m2) {m1 = m1 | m2; return m1;} \
FORCEINLINE mask_t& operator &= (mask_t& m1, mask_t m2) {m1 = m1 & m2; return m1;} \
FORCEINLINE mask_t& operator ^= (mask_t& m1, mask_t m2) {m1 = m1 ^ m2; return m1;} \
FORCEINLINE mask_t operator ~(mask_t m) {return (mask_t)(~(int)m);}
/** Informative template class exposing basic enumeration properties used by several
* other templates below. Here we have only forward declaration. For each enum type
* we will create specialization derived from MakeEnumPropsT<>.
* i.e.:
* template <> struct EnumPropsT<Track> : MakeEnumPropsT<Track, byte, TRACK_BEGIN, TRACK_END, INVALID_TRACK> {};
* followed by:
* typedef TinyEnumT<Track> TrackByte;
*/
template <typename Tenum_t> struct EnumPropsT;
/** Helper template class that makes basic properties of given enumeration type visible
* from outsize. It is used as base class of several EnumPropsT specializations each
* dedicated to one of commonly used enumeration types.
* @param Tenum_t enumeration type that you want to describe
* @param Tstorage_t what storage type would be sufficient (i.e. byte)
* @param Tbegin first valid value from the contiguous range (i.e. TRACK_BEGIN)
* @param Tend one past the last valid value from the contiguous range (i.e. TRACK_END)
* @param Tinvalid value used as invalid value marker (i.e. INVALID_TRACK)
*/
template <typename Tenum_t, typename Tstorage_t, Tenum_t Tbegin, Tenum_t Tend, Tenum_t Tinvalid>
struct MakeEnumPropsT {
typedef Tenum_t type; ///< enum type (i.e. Trackdir)
typedef Tstorage_t storage; ///< storage type (i.e. byte)
static const Tenum_t begin = Tbegin; ///< lowest valid value (i.e. TRACKDIR_BEGIN)
static const Tenum_t end = Tend; ///< one after the last valid value (i.e. TRACKDIR_END)
static const Tenum_t invalid = Tinvalid; ///< what value is used as invalid value (i.e. INVALID_TRACKDIR)
};
/** In some cases we use byte or uint16 to store values that are defined as enum. It is
* necessary in order to control the sizeof() such values. Some compilers make enum
* the same size as int (4 or 8 bytes instead of 1 or 2). As a consequence the strict
* compiler type - checking causes errors like:
* 'HasPowerOnRail' : cannot convert parameter 1 from 'byte' to 'RailType' when
* u->u.rail.railtype is passed as argument or type RailType. In such cases it is better
* to teach the compiler that u->u.rail.railtype is to be treated as RailType. */
template <typename Tenum_t> struct TinyEnumT;
/** The general declaration of TinyEnumT<> (above) */
template <typename Tenum_t>
struct TinyEnumT {
typedef Tenum_t enum_type; ///< expose our enumeration type (i.e. Trackdir) to outside
typedef EnumPropsT<Tenum_t> Props; ///< make easier access to our enumeration propeties
typedef typename Props::storage storage_type; ///< small storage type
static const enum_type begin = Props::begin; ///< enum beginning (i.e. TRACKDIR_BEGIN)
static const enum_type end = Props::end; ///< enum end (i.e. TRACKDIR_END)
static const enum_type invalid = Props::invalid;///< invalid value (i.e. INVALID_TRACKDIR)
storage_type m_val; ///< here we hold the actual value in small (i.e. byte) form
/** Cast operator - invoked then the value is assigned to the Tenum_t type */
FORCEINLINE operator enum_type () const
{
return (enum_type)m_val;
}
/** Assignment operator (from Tenum_t type) */
FORCEINLINE TinyEnumT& operator = (enum_type e)
{
m_val = (storage_type)e;
return *this;
}
/** Assignment operator (from Tenum_t type) */
FORCEINLINE TinyEnumT& operator = (uint u)
{
m_val = (storage_type)u;
return *this;
}
/** postfix ++ operator on tiny type */
FORCEINLINE TinyEnumT operator ++ (int)
{
TinyEnumT org = *this;
if (++m_val >= end) m_val -= (storage_type)(end - begin);
return org;
}
/** prefix ++ operator on tiny type */
FORCEINLINE TinyEnumT& operator ++ ()
{
if (++m_val >= end) m_val -= (storage_type)(end - begin);
return *this;
}
};
/** Template of struct holding enum types (on most archs, enums are stored in an int32). No math operators are provided. */
template <typename enum_type, typename storage_type>
struct SimpleTinyEnumT {
storage_type m_val; ///< here we hold the actual value in small (i.e. byte) form
/** Cast operator - invoked then the value is assigned to the storage_type */
FORCEINLINE operator enum_type () const
{
return (enum_type)this->m_val;
}
/** Assignment operator (from enum_type) */
FORCEINLINE SimpleTinyEnumT &operator = (enum_type e)
{
this->m_val = (storage_type)e;
return *this;
}
/** Assignment operator (from general uint) */
FORCEINLINE SimpleTinyEnumT &operator = (uint u)
{
this->m_val = (storage_type)u;
return *this;
}
/** Bit math (or) assignment operator (from enum_type) */
FORCEINLINE SimpleTinyEnumT &operator |= (enum_type e)
{
this->m_val = (storage_type)((enum_type)this->m_val | e);
return *this;
}
/** Bit math (and) assignment operator (from enum_type) */
FORCEINLINE SimpleTinyEnumT &operator &= (enum_type e)
{
this->m_val = (storage_type)((enum_type)this->m_val & e);
return *this;
}
};
#endif /* ENUM_TYPE_HPP */
|