00001
00017 #ifndef INC_MI32_ENUMSET_H
00018 #define INC_MI32_ENUMSET_H
00019
00020 #ifndef INC_MI32_STDDEFNS_H
00021 #include <mi32/stddefns.h>
00022 #endif
00023
00024 #ifndef INC_STRING_H
00025 #ifndef GENERATING_DOXYGEN_OUTPUT
00026 #include <string.h>
00027 #define INC_STRING_H
00028 #endif
00029 #endif
00030
00032 template <typename _ENUMTYPE, _ENUMTYPE _LAST, _ENUMTYPE _ALL = static_cast<_ENUMTYPE>(-1)> class ENUMSET {
00033 public:
00034
00036 ENUMSET (
00037 ) { Clear(); }
00038
00041 ENUMSET (
00042 _ENUMTYPE enumval
00043 ) { Clear(); operator+=(enumval); }
00044
00046 ENUMSET (
00047 _ENUMTYPE enumval1,
00048 _ENUMTYPE enumval2
00049 ) { Clear(); operator+=(enumval1); operator+=(enumval2); }
00050
00052 ENUMSET (
00053 _ENUMTYPE enumval1,
00054 _ENUMTYPE enumval2,
00055 _ENUMTYPE enumval3
00056 ) { Clear(); operator+=(enumval1); operator+=(enumval2); operator+=(enumval3); }
00057
00059 ENUMSET& operator+= (
00060 _ENUMTYPE rhs
00061 ) { if (rhs == _ALL) SetAll(); else m_enumvalbits[rhs/32] |= 1 << (rhs % 32); return (*this); }
00062
00064 ENUMSET& operator+= (
00065 const ENUMSET<_ENUMTYPE, _LAST, _ALL>& rhs
00066 ) { for (INT32 i = 0;(i < (_LAST+31)/32);++i) m_enumvalbits[i] |= rhs.m_enumvalbits[i]; return (*this); }
00067
00069 ENUMSET& operator-= (
00070 _ENUMTYPE rhs
00071 ) { if (rhs == _ALL) Clear(); else m_enumvalbits[rhs/32] &= ~(1 << (rhs % 32)); return (*this); }
00072
00074 void Clear (
00075 ) { memset(m_enumvalbits,0,sizeof(m_enumvalbits)); return; }
00076
00078 bool Contains (
00079 _ENUMTYPE enumval
00080 ) const { return ((m_enumvalbits[enumval/32] & (1 << (enumval % 32))) != 0); }
00081
00084 _ENUMTYPE GetFirst (
00085 ) const { return (GetNext(_ALL)); }
00086
00088 _ENUMTYPE GetNext (
00089 _ENUMTYPE enumval
00090 ) const {
00091 do {
00092 ++enumval;
00093 if (Contains(enumval)) break;
00094 } while (enumval < _LAST);
00095 return (enumval);
00096 }
00097
00098 void SetAll (
00099 ) { memset(m_enumvalbits,255,sizeof(m_enumvalbits)); return; }
00100
00101 private:
00102 #ifndef GENERATING_DOXYGEN_OUTPUT
00103 UINT32 m_enumvalbits[(_LAST+31)/32];
00104 #endif // GENERATING_DOXYGEN_OUTPUT
00105 };
00106
00107
00108 #endif // INC_MI32_ENUMSET_H