00001 00020 #ifndef INC_MI32_ELEMTYPESET_H 00021 #define INC_MI32_ELEMTYPESET_H 00022 00023 #ifndef INC_MI32_ELEMTYPE_H 00024 #include <mi32/elemtype.h> 00025 #endif 00026 00027 #ifndef INC_MEMORY_H 00028 #include <memory.h> // Includes defn for memset() 00029 #define INC_MEMORY_H 00030 #endif 00031 00034 class ELEMTYPESET { 00035 public: 00036 00038 ELEMTYPESET ( 00039 ) { Clear(); } 00040 00043 ELEMTYPESET ( 00044 ELEMTYPE elemtype 00045 ) { Clear(); operator+=(elemtype); } 00046 00048 ELEMTYPESET ( 00049 ELEMTYPE elemtype1, 00050 ELEMTYPE elemtype2 00051 ) { Clear(); operator+=(elemtype1); operator+=(elemtype2); } 00052 00054 ELEMTYPESET ( 00055 ELEMTYPE elemtype1, 00056 ELEMTYPE elemtype2, 00057 ELEMTYPE elemtype3 00058 ) { Clear(); operator+=(elemtype1); operator+=(elemtype2); operator+=(elemtype3); } 00059 00061 ELEMTYPESET& operator+= ( 00062 ELEMTYPE rhs 00063 ) { if (rhs == ELEMTYPE_NumTypes) SetAll(); else m_elemtypebits[rhs/32] |= 1 << (rhs % 32); return (*this); } 00064 00066 ELEMTYPESET& operator+= ( 00067 const ELEMTYPESET& rhs 00068 ) { for (INT32 i = 0;(i < (ELEMTYPE_NumTypes+31)/32);++i) m_elemtypebits[i] |= rhs.m_elemtypebits[i]; return (*this); } 00069 00071 ELEMTYPESET& operator-= ( 00072 ELEMTYPE rhs 00073 ) { if (rhs == ELEMTYPE_NumTypes) Clear(); else m_elemtypebits[rhs/32] &= ~(1 << (rhs % 32)); return (*this); } 00074 00076 void Clear ( 00077 ) { memset(m_elemtypebits,0,sizeof(m_elemtypebits)); return; } 00078 00080 bool Contains ( 00081 ELEMTYPE elemtype 00082 ) const { return ((m_elemtypebits[elemtype/32] & (1 << (elemtype % 32))) != 0); } 00083 00086 ELEMTYPE GetFirst ( 00087 ) const { return (GetNext(ELEMTYPE_Empty)); } 00088 00090 ELEMTYPE GetNext ( 00091 ELEMTYPE elemtype 00092 ) const { 00093 do { 00094 ++elemtype; 00095 if (Contains(elemtype)) break; 00096 } while (elemtype < ELEMTYPE_NumTypes); 00097 return (elemtype); 00098 } 00099 00100 void SetAll ( 00101 ) { memset(m_elemtypebits,255,sizeof(m_elemtypebits)); return; } 00102 00103 private: 00104 #ifndef GENERATING_DOXYGEN_OUTPUT 00105 UINT32 m_elemtypebits[(ELEMTYPE_NumTypes+31)/32]; 00106 #endif // GENERATING_DOXYGEN_OUTPUT 00107 }; 00108 00109 00110 #endif
1.6.1