00001
00033 #ifndef INC_RVC_OTYPESET_H
00034 #define INC_RVC_OTYPESET_H
00035
00036 #ifndef INC_MI32_STDDEFNS_H
00037 #include <mi32/stddefns.h>
00038 #endif
00039
00040 #ifndef INC_RVC_OBJTYPE_H
00041 #include <rvc/objtype.h>
00042 #endif
00043
00044 #ifndef INC_STRING_H
00045 #ifndef GENERATING_DOXYGEN_OUTPUT
00046 #include <string.h>
00047 #define INC_STRING_H
00048 #endif
00049 #endif
00050
00051 #ifdef RVCSYSDLL
00052 #define CLASSEXPORT MI_DLLCLASSEXPORT
00053 #else
00054 #define CLASSEXPORT MI_DLLCLASSIMPORT
00055 #endif
00056
00057 namespace RVC {
00058
00059
00062 class CLASSEXPORT OBJTYPESET {
00063 public:
00064
00066 OBJTYPESET (
00067 ) { Clear(); }
00068
00071 OBJTYPESET (
00072 RVC::OBJTYPE objtype
00073 ) { Clear(); operator+=(objtype); }
00074
00076 OBJTYPESET (
00077 RVC::OBJTYPE objtype1,
00078 RVC::OBJTYPE objtype2
00079 ) { Clear(); operator+=(objtype1); operator+=(objtype2); }
00080
00082 OBJTYPESET (
00083 RVC::OBJTYPE objtype1,
00084 RVC::OBJTYPE objtype2,
00085 RVC::OBJTYPE objtype3
00086 ) { Clear(); operator+=(objtype1); operator+=(objtype2); operator+=(objtype3); }
00087
00089 OBJTYPESET (
00090 RVC::OBJTYPE objtype1,
00091 RVC::OBJTYPE objtype2,
00092 RVC::OBJTYPE objtype3,
00093 RVC::OBJTYPE objtype4
00094 ) { Clear(); operator+=(objtype1); operator+=(objtype2); operator+=(objtype3); operator+=(objtype4); }
00095
00097 OBJTYPESET& operator+= (
00098 RVC::OBJTYPE rhs
00099 ) { if (rhs == OBJTYPE_All) SetAll(); else m_objtypebits[rhs/32] |= 1 << (rhs % 32); return (*this); }
00100
00102 OBJTYPESET& operator+= (
00103 const RVC::OBJTYPESET& rhs
00104 ) { for (INT32 i = 0; (i < (OBJTYPE_LAST+31)/32); ++i) m_objtypebits[i] |= rhs.m_objtypebits[i]; return (*this); }
00105
00107 OBJTYPESET& operator-= (
00108 RVC::OBJTYPE rhs
00109 ) { if (rhs == OBJTYPE_All) Clear(); else { m_objtypebits[0] &= ~1; m_objtypebits[rhs/32] &= ~(1 << (rhs % 32)); } return (*this); }
00110
00112 void AddType (
00113 RVC::OBJTYPE objtype
00114 ) { m_objtypebits[objtype/32] |= 1 << (objtype % 32); }
00115
00117 void AddValidParentTypes (
00118 RVC::OBJTYPE objtype
00119 );
00120
00122 void Clear (
00123 ) { memset(m_objtypebits,0,sizeof(m_objtypebits)); return; }
00124
00126 bool Contains (
00127 RVC::OBJTYPE objtype
00128 ) const { return ((m_objtypebits[objtype/32] & (1 << (objtype % 32))) != 0); }
00129
00131 bool ContainsOnly (
00132 RVC::OBJTYPE objtype
00133 ) const { return (GetFirst() == objtype && GetNext(objtype) == OBJTYPE_LAST); }
00134
00137 RVC::OBJTYPE GetFirst (
00138 ) const { return (GetNext(OBJTYPE_All)); }
00139
00141 void GetIniTag (
00142 char *str
00143 ) const;
00144
00146 void GetValidParentTypeSet (
00147 OBJTYPESET& ValidParentTypeSet,
00148 bool clear = true
00149 ) const;
00150
00152 RVC::OBJTYPE GetNext (
00153 OBJTYPE objtype
00154 ) const {
00155 do {
00156 ++objtype;
00157 if (Contains(objtype)) break;
00158 } while (objtype < OBJTYPE_LAST);
00159 return (objtype);
00160 }
00161
00162 void SetAll (
00163 ) { memset(m_objtypebits,255,sizeof(m_objtypebits)); return; }
00164
00165 private:
00166 #ifndef GENERATING_DOXYGEN_OUTPUT
00167 UINT32 m_objtypebits[(OBJTYPE_LAST+31)/32];
00168 #endif // GENERATING_DOXYGEN_OUTPUT
00169 };
00170
00171
00172
00173 }
00174
00175 #undef CLASSEXPORT
00176
00177 #endif // INC_RVC_OTYPESET_H