00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef INC_MI32_ELEMTYPESET_H
00019 #define INC_MI32_ELEMTYPESET_H
00020
00021 #ifndef INC_MI32_STDDEFNS_H
00022 #include <mi32/stddefns.h>
00023 #endif
00024
00025 #ifndef INC_MI32_ELEMTYPE_H
00026 #include <mi32/elemtype.h>
00027 #endif
00028
00029 #ifndef INC_STRING_H
00030 #include <string.h>
00031 #define INC_STRING_H
00032 #endif
00033
00034
00035
00036 class ELEMTYPESET {
00037 public:
00038
00039
00040 ELEMTYPESET (
00041 ) { Clear(); }
00042
00043
00044
00045 ELEMTYPESET (
00046 ELEMTYPE elemtype
00047 ) { Clear(); operator+=(elemtype); }
00048
00049
00050 ELEMTYPESET (
00051 ELEMTYPE elemtype1,
00052 ELEMTYPE elemtype2
00053 ) { Clear(); operator+=(elemtype1); operator+=(elemtype2); }
00054
00055
00056 ELEMTYPESET (
00057 ELEMTYPE elemtype1,
00058 ELEMTYPE elemtype2,
00059 ELEMTYPE elemtype3
00060 ) { Clear(); operator+=(elemtype1); operator+=(elemtype2); operator+=(elemtype3); }
00061
00062
00063 ELEMTYPESET& operator+= (
00064 ELEMTYPE rhs
00065 ) { if (rhs == ELEMTYPE_NumTypes) SetAll(); else m_elemtypebits[rhs/32] |= 1 << (rhs % 32); return (*this); }
00066
00067
00068 ELEMTYPESET& operator+= (
00069 const ELEMTYPESET& rhs
00070 ) { for (INT32 i = 0;(i < (ELEMTYPE_NumTypes+31)/32);++i) m_elemtypebits[i] |= rhs.m_elemtypebits[i]; return (*this); }
00071
00072
00073 ELEMTYPESET& operator-= (
00074 ELEMTYPE rhs
00075 ) { if (rhs == ELEMTYPE_NumTypes) Clear(); else m_elemtypebits[rhs/32] &= ~(1 << (rhs % 32)); return (*this); }
00076
00077
00078 void Clear (
00079 ) { memset(m_elemtypebits,0,sizeof(m_elemtypebits)); return; }
00080
00081
00082 bool Contains (
00083 ELEMTYPE elemtype
00084 ) const { return ((m_elemtypebits[elemtype/32] & (1 << (elemtype % 32))) != 0); }
00085
00086
00087
00088 ELEMTYPE GetFirst (
00089 ) const { return (GetNext(ELEMTYPE_Empty)); }
00090
00091
00092 ELEMTYPE GetNext (
00093 ELEMTYPE elemtype
00094 ) const {
00095 do {
00096 ++elemtype;
00097 if (Contains(elemtype)) break;
00098 } while (elemtype < ELEMTYPE_NumTypes);
00099 return (elemtype);
00100 }
00101
00102 void SetAll (
00103 ) { memset(m_elemtypebits,255,sizeof(m_elemtypebits)); return; }
00104
00105 private:
00106 #ifndef GENERATING_DOXYGEN_OUTPUT
00107 UINT32 m_elemtypebits[(ELEMTYPE_NumTypes+31)/32];
00108 #endif // GENERATING_DOXYGEN_OUTPUT
00109 };
00110
00111
00112 #endif