TAPs 0.7.7.3
TAPsFlag.cpp
Go to the documentation of this file.
00001 /******************************************************************************
00002 TAPsFlag.cpp
00003 
00004 Flag class (cpp file).
00005 
00006 SUKITTI PUNAK   (07/01/2008)
00007 ******************************************************************************/
00008 #include "TAPsFlag.hpp"
00009 // Using Inclusion Model (i.e. definitions are included in declarations)
00010 //                       (this name.cpp is included in name.hpp)
00011 // Each friend is defined directly inside its declaration.
00012 
00013 BEGIN_NAMESPACE_TAPs__DS
00014 //=============================================================================
00015 // Constructors
00016 //-----------------------------------------------------------------------------
00017 template <typename T, int Bits, typename Holder>
00018 Flag<T,Bits,Holder>::Flag ( T f1 )
00019     : m_flags( f1 ) {}
00020 //-----------------------------------------------------------------------------
00021 template <typename T, int Bits, typename Holder>
00022 Flag<T,Bits,Holder>::Flag ( Holder flags ) 
00023     : m_flags( flags ) {}
00024 //-----------------------------------------------------------------------------
00025 /*
00026 template <typename T, int Bits, typename Holder>
00027 Flag<T,Bits,Holder>::Flag ( T flag, ... )
00028     : m_flags( 0 )
00029 {
00030     va_list list;
00031     va_start( list, flag );     // initialize variable arguments
00032     for( ;; ) {
00033       m_flags |= va_arg( marker, T);
00034       // Need a terminating thing HERE!
00035     }
00036     va_end( list );             // reset variable arguments
00037 }
00038 //*/
00039 //-----------------------------------------------------------------------------
00040 template <typename T, int Bits, typename Holder>
00041 Flag<T,Bits,Holder>::~Flag ()
00042 {}  
00043 //-----------------------------------------------------------------------------
00044 template <typename T, int Bits, typename Holder>
00045 std::string Flag<T,Bits,Holder>::StrInfo () const
00046 {
00047     std::ostringstream ss;
00048     ss << "Flag of " << "type: " << typeid(T).name() << ", " 
00049                   << "size: " << Bits << ", "
00050                   << "holder: " << typeid(Holder).name() << ", with";
00051     ss << " set flag_bits: ";
00052     Holder val = 1;
00053     char ch[Bits];
00054     for ( int i = 0; i < Bits; ++i ) {
00055         if ( m_flags & val )    ch[i] = '1';
00056         else                    ch[i] = '0';
00057         (val = val << 1);
00058     }
00059     for ( int i = Bits-1; i >= 0; --i ) {
00060         ss << ch[i];
00061         if ( i % 4 == 0 ) ss << " ";
00062     }
00063     
00064     ss << " decimal value: " << static_cast<unsigned int>( m_flags );
00065 
00066     return ss.str();
00067 }
00068 //-----------------------------------------------------------------------------
00069 //=============================================================================
00070 // Assignment Operator
00071 //-----------------------------------------------------------------------------
00072 template <typename T, int Bits, typename Holder> Flag<T,Bits,Holder> & 
00073 Flag<T,Bits,Holder>::operator= ( Flag<T,Bits,Holder> const & flag )
00074 {
00075     m_flags = flag.m_flags;
00076     return *this;
00077 }
00078 //-----------------------------------------------------------------------------
00079 //=============================================================================
00080 // Comparison Operators
00081 //-----------------------------------------------------------------------------
00082 template <typename T, int Bits, typename Holder> bool
00083 Flag<T,Bits,Holder>::operator== ( Flag<T,Bits,Holder> const & flag ) const
00084 {
00085     return m_flags == flag.m_flags;
00086 }
00087 //-----------------------------------------------------------------------------
00088 template <typename T, int Bits, typename Holder> bool
00089 Flag<T,Bits,Holder>::operator!= ( Flag<T,Bits,Holder> const & flag ) const
00090 {
00091     return m_flags != flag.m_flags;
00092 }
00093 //-----------------------------------------------------------------------------
00094 template <typename T, int Bits, typename Holder> bool
00095 Flag<T,Bits,Holder>::operator< ( Flag<T,Bits,Holder> const & flag ) const
00096 {
00097     return m_flags < flag.m_flags;
00098 }
00099 //-----------------------------------------------------------------------------
00100 template <typename T, int Bits, typename Holder> bool
00101 Flag<T,Bits,Holder>::operator>= ( Flag<T,Bits,Holder> const & flag ) const
00102 {
00103     return m_flags >= flag.m_flags;
00104 }
00105 //-----------------------------------------------------------------------------
00106 template <typename T, int Bits, typename Holder> bool
00107 Flag<T,Bits,Holder>::operator> ( Flag<T,Bits,Holder> const & flag ) const
00108 {
00109     return m_flags > flag.m_flags;
00110 }
00111 //-----------------------------------------------------------------------------
00112 template <typename T, int Bits, typename Holder> bool
00113 Flag<T,Bits,Holder>::operator<= ( Flag<T,Bits,Holder> const & flag ) const
00114 {
00115     return m_flags <= flag.m_flags;
00116 }
00117 //-----------------------------------------------------------------------------
00118 //=============================================================================
00119 // Bitwise Operators
00120 //-----------------------------------------------------------------------------
00121 template <typename T, int Bits, typename Holder> Flag<T,Bits,Holder> 
00122 Flag<T,Bits,Holder>::operator~ () const
00123 {
00124     return Flag<T,Bits,Holder>( ~m_flags );
00125 }
00126 //-----------------------------------------------------------------------------
00127 template <typename T, int Bits, typename Holder> Flag<T,Bits,Holder> 
00128 Flag<T,Bits,Holder>::operator& ( Flag<T,Bits,Holder> const & flag ) const
00129 {
00130     return Flag<T,Bits,Holder>( m_flags & flag.m_flags );
00131 }
00132 //-----------------------------------------------------------------------------
00133 template <typename T, int Bits, typename Holder> Flag<T,Bits,Holder> 
00134 Flag<T,Bits,Holder>::operator| ( Flag<T,Bits,Holder> const & flag ) const
00135 {
00136     return Flag<T,Bits,Holder>( m_flags | flag.m_flags );
00137 }
00138 //-----------------------------------------------------------------------------
00139 template <typename T, int Bits, typename Holder> Flag<T,Bits,Holder> & 
00140 Flag<T,Bits,Holder>::operator&= ( Flag<T,Bits,Holder> const & flag )
00141 {
00142     m_flags &= flag.m_flags;
00143     return *this;
00144 }
00145 //-----------------------------------------------------------------------------
00146 template <typename T, int Bits, typename Holder> Flag<T,Bits,Holder> & 
00147 Flag<T,Bits,Holder>::operator|= ( Flag<T,Bits,Holder> const & flag )
00148 {
00149     m_flags |= flag.m_flags;
00150     return *this;
00151 }
00152 //-----------------------------------------------------------------------------
00153 //=============================================================================
00154 // Operations
00155 //-----------------------------------------------------------------------------
00156 template <typename T, int Bits, typename Holder> void
00157 Flag<T,Bits,Holder>::ClearAll ()
00158 {
00159     m_flags = 0;
00160 }
00161 //-----------------------------------------------------------------------------
00162 template <typename T, int Bits, typename Holder> void
00163 Flag<T,Bits,Holder>::SetAll ()
00164 {
00165     Holder val = 1;
00166     for ( int i = 0; i < Bits; ++i ) {
00167         m_flags |= val;
00168         (val = val << 1);
00169     }
00170 }
00171 //-----------------------------------------------------------------------------
00172 template <typename T, int Bits, typename Holder> void
00173 Flag<T,Bits,Holder>::ClearFlagNumber ( int i )
00174 {
00175     assert( i < Bits );
00176     Holder val = 1;
00177     //std::cout << "VAL# " << 0 << " : " << val << std::endl;
00178     int b = 1;
00179     for ( ; b <= i; ++b ) {
00180         (val = val << 1);
00181         val += 1;
00182         //std::cout << "VAL# " << b << " : " << val << std::endl;
00183     }
00184     (val = val << 1);
00185     for ( ++b; b < Bits; ++b ) {
00186         (val = val << 1);
00187         val += 1;
00188         //std::cout << "VAL# " << b << " : " << val << std::endl;
00189     }
00190 
00191     /*
00192     std::cout << "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
00193     Holder A = 1;
00194     char ch[Bits];
00195     for ( int b = 0; b < Bits; ++b ) {
00196         if ( A & val )  ch[b] = '1';
00197         else                    ch[b] = '0';
00198         (A = A << 1);
00199     }
00200     for ( int b = Bits-1; b >= 0; --b ) {
00201         std::cout << ch[b];
00202         if ( b % 4 == 0 ) std::cout << " ";
00203     }
00204     std::cout << std::endl;
00205     //*/
00206 
00207     m_flags &= val;
00208 }
00209 //-----------------------------------------------------------------------------
00210 template <typename T, int Bits, typename Holder> void
00211 Flag<T,Bits,Holder>::SetFlagNumber ( int i )
00212 {
00213     assert( i < Bits );
00214     m_flags |= ( 1 << i );
00215 }
00216 //-----------------------------------------------------------------------------
00217 template <typename T, int Bits, typename Holder> void
00218 Flag<T,Bits,Holder>::ClearFlag ( T flag )
00219 {
00220     m_flags |= flag;    // Bitwise OR   --> make the flag become 1
00221     m_flags ^= flag;    // Bitwise XOR  --> 1 XOR 1 results in 0
00222 }
00223 //-----------------------------------------------------------------------------
00224 template <typename T, int Bits, typename Holder> void
00225 Flag<T,Bits,Holder>::SetFlag ( T flag )
00226 {
00227     m_flags |= flag;    // Bitwise OR   --> make the flag become 1
00228 }
00229 //-----------------------------------------------------------------------------
00230 //=============================================================================
00231 // Check status
00232 //-----------------------------------------------------------------------------
00233 template <typename T, int Bits, typename Holder> bool 
00234 Flag<T,Bits,Holder>::CheckFlagNumber ( int i ) const
00235 {
00236     Holder result = m_flags & ( 1 << i );
00237     if ( result > 0 ) return true;
00238     return false;
00239 }
00240 //-----------------------------------------------------------------------------
00241 template <typename T, int Bits, typename Holder> bool 
00242 Flag<T,Bits,Holder>::CheckFlag ( T flag ) const
00243 {
00244     Holder result = m_flags & flag;
00245     if ( result > 0 ) return true;
00246     return false;
00247 }
00248 //-----------------------------------------------------------------------------
00249 //=============================================================================
00250 END_NAMESPACE_TAPs__DS
00251 //34567890123456789012345678901234567890123456789012345678901234567890123456789
00252 //--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines