![]() |
TAPs 0.7.7.3
|
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----+----