elemtypeset.h

Go to the documentation of this file.
00001 /**
00002  * \file mi32/elemtypeset.h 
00003  * \brief Define ELEMTYPESET class.
00004  *
00005  * \if NODOC
00006  * $Id: elemtypeset.h_v 1.2 2004/07/20 21:23:36 scowan Exp $
00007  *
00008  * $Log: elemtypeset.h_v $
00009  * Revision 1.2  2004/07/20 21:23:36  scowan
00010  * Fixed get first method.
00011  *
00012  * Revision 1.1  2004/07/19 16:32:54  scowan
00013  * Initial revision
00014  *
00015  * \endif
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>     // Includes defn for memset()
00031 #define  INC_STRING_H
00032 #endif
00033 
00034 //! \class OBJTYPESET rvc/otypeset.h
00035 //! \brief Class to represent "set" of RVC object types.
00036 class ELEMTYPESET {
00037    public:
00038 
00039       //! Default constructor, creates empty set.
00040       ELEMTYPESET (
00041          ) { Clear(); }
00042 
00043       //! Implicit constructor from ELEMTYPE.
00044       //! Allows a single ELEMTYPE value to be passed wherever ELEMTYPESET is specified.
00045       ELEMTYPESET (
00046          ELEMTYPE elemtype
00047          ) { Clear(); operator+=(elemtype); }
00048 
00049       //! Convenience constructor for specifying two elemect types.
00050       ELEMTYPESET (
00051          ELEMTYPE elemtype1,
00052          ELEMTYPE elemtype2
00053          ) { Clear(); operator+=(elemtype1); operator+=(elemtype2); }
00054 
00055       //! Convenience constructor for specifying three elemect types.
00056       ELEMTYPESET (
00057          ELEMTYPE elemtype1,
00058          ELEMTYPE elemtype2,
00059          ELEMTYPE elemtype3
00060          ) { Clear(); operator+=(elemtype1); operator+=(elemtype2); operator+=(elemtype3); }
00061 
00062       //! Add type to set.
00063       ELEMTYPESET& operator+= (
00064          ELEMTYPE rhs
00065          ) { if (rhs == ELEMTYPE_NumTypes) SetAll(); else m_elemtypebits[rhs/32] |= 1 << (rhs % 32); return (*this); }
00066 
00067       //! Add type set to set.
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       //! Remove type from set.
00073       ELEMTYPESET& operator-= (
00074          ELEMTYPE rhs
00075          ) { if (rhs == ELEMTYPE_NumTypes) Clear(); else m_elemtypebits[rhs/32] &= ~(1 << (rhs % 32)); return (*this); }
00076 
00077       //! Clear set.
00078       void Clear (
00079          ) { memset(m_elemtypebits,0,sizeof(m_elemtypebits)); return; }
00080 
00081       //! Determine if set contains specified elemect type.
00082       bool Contains (
00083          ELEMTYPE elemtype
00084          ) const { return ((m_elemtypebits[elemtype/32] & (1 << (elemtype % 32))) != 0); }
00085 
00086       //! Get first elemect type in set.
00087       //! @return First elemect type or ELEMTYPE_NumTypes if no more in set.
00088       ELEMTYPE GetFirst (
00089          ) const { return (GetNext(ELEMTYPE_Empty)); }
00090 
00091       //! Get next elemect type in set.
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   //!< INC_RVC_OTYPESET_H

Generated on Tue Dec 14 13:18:21 2004 for TNTsdk by  doxygen 1.3.8-20040913