27 #ifndef PTLIB_BITWISE_ENUM_H
28 #define PTLIB_BITWISE_ENUM_H
38 template <
typename BaseEnum, BaseEnum MaxValue,
typename BaseInt =
unsigned>
97 #define P_BITWISE_ENUM_INTERNAL_OP1(op) (static_cast<IntType>(m_enum) op static_cast<IntType>(rhs))
98 #define P_BITWISE_ENUM_INTERNAL_OP2(op) static_cast<Enumeration>(P_BITWISE_ENUM_INTERNAL_OP1(op))
146 #define P_DECLARE_BITWISE_ENUM_1(_0,_1)_0=0,_1=1
147 #define P_DECLARE_BITWISE_ENUM_2(_0,_1,_2)P_DECLARE_BITWISE_ENUM_1(_0,_1),_2=2
148 #define P_DECLARE_BITWISE_ENUM_3(_0,_1,_2,_3)P_DECLARE_BITWISE_ENUM_2(_0,_1,_2),_3=4
149 #define P_DECLARE_BITWISE_ENUM_4(_0,_1,_2,_3,_4)P_DECLARE_BITWISE_ENUM_3(_0,_1,_2,_3),_4=8
150 #define P_DECLARE_BITWISE_ENUM_5(_0,_1,_2,_3,_4,_5)P_DECLARE_BITWISE_ENUM_4(_0,_1,_2,_3,_4),_5=16
151 #define P_DECLARE_BITWISE_ENUM_6(_0,_1,_2,_3,_4,_5,_6)P_DECLARE_BITWISE_ENUM_5(_0,_1,_2,_3,_4,_5),_6=32
152 #define P_DECLARE_BITWISE_ENUM_7(_0,_1,_2,_3,_4,_5,_6,_7)P_DECLARE_BITWISE_ENUM_6(_0,_1,_2,_3,_4,_5,_6),_7=64
153 #define P_DECLARE_BITWISE_ENUM_8(_0,_1,_2,_3,_4,_5,_6,_7,_8)P_DECLARE_BITWISE_ENUM_7(_0,_1,_2,_3,_4,_5,_6,_7),_8=128
154 #define P_DECLARE_BITWISE_ENUM_9(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9)P_DECLARE_BITWISE_ENUM_8(_0,_1,_2,_3,_4,_5,_6,_7,_8),_9=256
155 #define P_DECLARE_BITWISE_ENUM_10(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10)P_DECLARE_BITWISE_ENUM_9(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9),_10=512
156 #define P_DECLARE_BITWISE_ENUM_11(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11)P_DECLARE_BITWISE_ENUM_10(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10),_11=1024
157 #define P_DECLARE_BITWISE_ENUM_12(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12)P_DECLARE_BITWISE_ENUM_11(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11),_11=2048
159 #define P_DECLARE_BITWISE_NAMES_1(_0,_1)#_0,#_1
160 #define P_DECLARE_BITWISE_NAMES_2(_0,_1,_2)P_DECLARE_BITWISE_NAMES_1(_0,_1),#_2
161 #define P_DECLARE_BITWISE_NAMES_3(_0,_1,_2,_3)P_DECLARE_BITWISE_NAMES_2(_0,_1,_2),#_3
162 #define P_DECLARE_BITWISE_NAMES_4(_0,_1,_2,_3,_4)P_DECLARE_BITWISE_NAMES_3(_0,_1,_2,_3),#_4
163 #define P_DECLARE_BITWISE_NAMES_5(_0,_1,_2,_3,_4,_5)P_DECLARE_BITWISE_NAMES_4(_0,_1,_2,_3,_4),#_5
164 #define P_DECLARE_BITWISE_NAMES_6(_0,_1,_2,_3,_4,_5,_6)P_DECLARE_BITWISE_NAMES_5(_0,_1,_2,_3,_4,_5),#_6
165 #define P_DECLARE_BITWISE_NAMES_7(_0,_1,_2,_3,_4,_5,_6,_7)P_DECLARE_BITWISE_NAMES_6(_0,_1,_2,_3,_4,_5,_6),#_7
166 #define P_DECLARE_BITWISE_NAMES_8(_0,_1,_2,_3,_4,_5,_6,_7,_8)P_DECLARE_BITWISE_NAMES_7(_0,_1,_2,_3,_4,_5,_6,_7),#_8
167 #define P_DECLARE_BITWISE_NAMES_9(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9)P_DECLARE_BITWISE_NAMES_8(_0,_1,_2,_3,_4,_5,_6,_7,_8),#_9
168 #define P_DECLARE_BITWISE_NAMES_10(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10)P_DECLARE_BITWISE_NAMES_9(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9),#_10
169 #define P_DECLARE_BITWISE_NAMES_11(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11)P_DECLARE_BITWISE_NAMES_10(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10),#_11
170 #define P_DECLARE_BITWISE_NAMES_12(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12)P_DECLARE_BITWISE_NAMES_11(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11),#_12
172 #define P_DECLARE_BITWISE_ENUM_FRIENDS(name) \
173 __inline friend name##_Bits operator+(name##_Bits lhs, name##_Bits rhs) \
174 { return static_cast<name##_Bits>(static_cast<unsigned>(lhs) | static_cast<unsigned>(rhs)); } \
175 __inline friend name##_Bits operator|(name##_Bits lhs, name##_Bits rhs) \
176 { return static_cast<name##_Bits>(static_cast<unsigned>(lhs) | static_cast<unsigned>(rhs)); } \
177 __inline friend name##_Bits operator-(name##_Bits lhs, name##_Bits rhs) \
178 { return static_cast<name##_Bits>(static_cast<unsigned>(lhs) & ~static_cast<unsigned>(rhs)); }
180 #define P_DECLARE_BITWISE_ENUM_END(name, count) \
181 P_DECLARE_BITWISE_ENUM_FRIENDS(name) \
182 typedef PBitwiseEnum<name##_Bits, (name##_Bits)(1<<(count-1))> name
195 #define P_DECLARE_BITWISE_ENUM(name, count, values) \
196 enum name##_Bits { P_DECLARE_BITWISE_ENUM_##count values }; \
197 P_DECLARE_BITWISE_ENUM_END(name, count)
210 #define P_DECLARE_BITWISE_ENUM_EX(name, count, values, ...) \
211 enum name##_Bits { P_DECLARE_BITWISE_ENUM_##count values , ##__VA_ARGS__ }; \
212 P_DECLARE_BITWISE_ENUM_END(name, count)
215 #endif // PTLIB_BITWISE_ENUM_H
217 #if defined(PTLIB_STRING_H) && !defined(PTLIB_BITWISE_STREAMABLE_ENUM_H)
218 #define PTLIB_BITWISE_STREAMABLE_ENUM_H 1
220 extern void PPrintBitwiseEnum(std::ostream & strm,
unsigned bits,
char const *
const * names);
221 extern unsigned PReadBitwiseEnum(std::istream & strm,
char const *
const * names,
bool continueOnError =
false);
224 template <
typename BaseEnum, BaseEnum MaxValue,
typename BaseInt =
unsigned>
225 class PStreamableBitwiseEnum :
public PBitwiseEnum<BaseEnum, MaxValue, BaseInt>
230 __inline PStreamableBitwiseEnum(
typename BaseClass::Enumeration e = BaseClass::Zero()) : BaseClass(e) { }
231 __inline
virtual ~PStreamableBitwiseEnum() { }
233 friend __inline std::ostream &
operator<<(std::ostream & strm,
const PStreamableBitwiseEnum & e)
235 PPrintBitwiseEnum(strm, e.AsBits(), e.Names());
239 friend __inline std::istream & operator>>(std::istream & strm, PStreamableBitwiseEnum & e)
241 e.m_enum = BaseClass::FromBits(PReadBitwiseEnum(strm, e.Names(),
false));
252 bool FromString(
const PString & s,
bool clear =
true)
255 this->m_enum = BaseClass::Zero();
258 this->m_enum = BaseClass::FromBits(this->m_enum | PReadBitwiseEnum(strm, Names(),
true));
262 virtual char const *
const * Names()
const = 0;
265 #define P_DECLARE_STREAMABLE_BITWISE_ENUM_EX(name, count, values, ...) \
266 enum name##_Bits { P_DECLARE_BITWISE_ENUM_##count values }; \
267 P_DECLARE_BITWISE_ENUM_FRIENDS(name) \
268 class name : public PStreamableBitwiseEnum<name##_Bits, (name##_Bits)(1<<count)>{ \
269 public: typedef PStreamableBitwiseEnum<name##_Bits, (name##_Bits)(1<<count)> BaseClass; \
270 __inline name(BaseClass::Enumeration e = BaseClass::Zero()) : BaseClass(e) { } \
271 __inline explicit name(const PString & s) { FromString(s); } \
272 virtual char const * const * Names() const { static char const * const Strings[] = { __VA_ARGS__, NULL }; return Strings; } \
275 #define P_DECLARE_STREAMABLE_BITWISE_ENUM(name, count, values) \
276 P_DECLARE_STREAMABLE_BITWISE_ENUM_EX(name, count, values, P_DECLARE_BITWISE_NAMES_##count values)
279 #endif // defined(PTLIB_STRING_H) && !defined(PTLIB_BITWISE_STREAMABLE_ENUM_H)
__inline std::ostream & operator<<(std::ostream &strm, const PHashTableList &hash)
Definition: dict.h:180
__inline PBitwiseEnum operator-(Enumeration rhs) const
Definition: bitwise_enum.h:108
static __inline Enumeration FromBits(unsigned b)
Definition: bitwise_enum.h:65
__inline PBitwiseEnum operator|(Enumeration rhs) const
Definition: bitwise_enum.h:107
__inline bool operator<=(Enumeration rhs) const
Definition: bitwise_enum.h:114
__inline PBitwiseEnum operator*(Enumeration rhs) const
Definition: bitwise_enum.h:109
static __inline Enumeration Zero()
Definition: bitwise_enum.h:49
__inline PBitwiseEnum & operator*=(PBitwiseEnum rhs)
Definition: bitwise_enum.h:124
BaseEnum Enumeration
Definition: bitwise_enum.h:42
__inline PBitwiseEnum operator^(PBitwiseEnum rhs) const
Definition: bitwise_enum.h:131
__inline bool operator==(PBitwiseEnum rhs) const
Definition: bitwise_enum.h:134
__inline bool operator==(Enumeration rhs) const
Definition: bitwise_enum.h:113
__inline bool operator<=(PBitwiseEnum rhs) const
Definition: bitwise_enum.h:135
This class is a standard C++ stream class descendent for reading or writing streamed data to or from ...
Definition: pstring.h:2188
__inline bool operator>=(PBitwiseEnum rhs) const
Definition: bitwise_enum.h:136
PBitwiseEnum operator--()
Definition: bitwise_enum.h:83
__inline PBitwiseEnum operator-(PBitwiseEnum rhs) const
Definition: bitwise_enum.h:129
__inline bool operator!=(Enumeration rhs) const
Definition: bitwise_enum.h:117
__inline PBitwiseEnum & operator-=(PBitwiseEnum rhs)
Definition: bitwise_enum.h:123
__inline bool operator<(Enumeration rhs) const
Definition: bitwise_enum.h:118
__inline PBitwiseEnum & operator|=(PBitwiseEnum rhs)
Definition: bitwise_enum.h:121
__inline Enumeration * operator&()
Definition: bitwise_enum.h:63
#define P_BITWISE_ENUM_INTERNAL_OP1(op)
Definition: bitwise_enum.h:97
__inline PBitwiseEnum & operator|=(Enumeration rhs)
Definition: bitwise_enum.h:100
__inline PBitwiseEnum & operator^=(PBitwiseEnum rhs)
Definition: bitwise_enum.h:125
PBitwiseEnum operator++(int)
Definition: bitwise_enum.h:76
__inline PBitwiseEnum operator|(PBitwiseEnum rhs) const
Definition: bitwise_enum.h:127
__inline PBitwiseEnum & operator+=(Enumeration rhs)
Definition: bitwise_enum.h:101
__inline PBitwiseEnum & operator-=(Enumeration rhs)
Definition: bitwise_enum.h:102
static __inline Enumeration All()
Definition: bitwise_enum.h:50
__inline unsigned AsBits() const
Definition: bitwise_enum.h:64
static __inline Enumeration FromBit(unsigned b)
Definition: bitwise_enum.h:66
__inline PBitwiseEnum & operator=(Enumeration e)
Definition: bitwise_enum.h:58
__inline bool operator>=(Enumeration rhs) const
Definition: bitwise_enum.h:115
This class defines a set of operators for a bit wise enumeration.
Definition: bitwise_enum.h:39
The character string class.
Definition: pstring.h:108
__inline PBitwiseEnum operator~() const
Definition: bitwise_enum.h:142
__inline PBitwiseEnum operator*(PBitwiseEnum rhs) const
Definition: bitwise_enum.h:130
__inline bool operator!=(PBitwiseEnum rhs) const
Definition: bitwise_enum.h:138
__inline PBitwiseEnum & operator*=(Enumeration rhs)
Definition: bitwise_enum.h:103
__inline PBitwiseEnum operator+(PBitwiseEnum rhs) const
Definition: bitwise_enum.h:128
__inline PBitwiseEnum operator^(Enumeration rhs) const
Definition: bitwise_enum.h:110
static __inline Enumeration Begin()
Definition: bitwise_enum.h:51
#define P_BITWISE_ENUM_INTERNAL_OP2(op)
Definition: bitwise_enum.h:98
__inline bool operator>(Enumeration rhs) const
Definition: bitwise_enum.h:119
__inline PBitwiseEnum(Enumeration e=Zero())
Definition: bitwise_enum.h:54
PBitwiseEnum operator++()
Definition: bitwise_enum.h:68
__inline PBitwiseEnum & operator^=(Enumeration rhs)
Definition: bitwise_enum.h:104
Enumeration m_enum
Definition: bitwise_enum.h:46
__inline PBitwiseEnum & operator=(const PBitwiseEnum &e)
Definition: bitwise_enum.h:57
PBitwiseEnum operator--(int)
Definition: bitwise_enum.h:90
__inline PBitwiseEnum operator+(Enumeration rhs) const
Definition: bitwise_enum.h:106
static __inline Enumeration End()
Definition: bitwise_enum.h:52
__inline PBitwiseEnum(const PBitwiseEnum &e)
Definition: bitwise_enum.h:55
BaseInt IntType
Definition: bitwise_enum.h:43
__inline PBitwiseEnum & operator+=(PBitwiseEnum rhs)
Definition: bitwise_enum.h:122