00001
00002
00003
00004
00005
00006
00007 #ifndef DARRAY_H
00008 #define DARRAY_H
00009
00010
00011
00012 template<class Logic_t>
00013 class Darray {
00014 public:
00015 typedef Logic_t DataType;
00016 Darray( const int Size );
00017 Darray( const Darray& rhs );
00018 ~Darray();
00019 Darray& operator=( const Darray& rhs );
00020 Logic_t& operator[](const int i) { return _data[i]; }
00021 int Size() { return _Size; }
00022 private:
00023 int _Size;
00024 Logic_t* _data;
00025 };
00026
00027 template<class Logic_t>
00028 inline Darray<Logic_t>::Darray( const int Size )
00029 {
00030 _Size = Size;
00031 _data = new Logic_t[ _Size ];
00032 }
00033
00034 template<class Logic_t>
00035 inline Darray<Logic_t>::Darray(const Darray& rhs )
00036 : _Size( rhs._Size )
00037 {
00038 _data = new Logic_t[ _Size ];
00039 for( int i = 0; i < _Size; i++ ) _data[i] = rhs._data[i];
00040 }
00041
00042 template<class Logic_t>
00043 inline Darray<Logic_t>::~Darray()
00044 {
00045 if ( _data != 0 ) { delete [] _data; _data = 0; }
00046 }
00047
00048 template<class Logic_t>
00049 inline Darray<Logic_t>& Darray<Logic_t>::operator=( const Darray& rhs ) {
00050 if ( this != &rhs ) {
00051 _Size = rhs._Size;
00052 for( int i = 0; i <= rhs._Size; i++ ) _data[i] = rhs._data[i];
00053 }
00054 return *this;
00055 }
00056
00057 template<class Logic_t>
00058 typename Darray<Logic_t>::DataType All( Darray<Logic_t>& a ) {
00059 typename Darray<Logic_t>::DataType tmp;
00060 tmp = 1;
00061 for( int i = 0; i< a.Size(); i++ ) tmp &= a[i];
00062 return tmp;
00063 };
00064
00065 template<class Logic_t>
00066 typename Darray<Logic_t>::DataType Any( Darray<Logic_t>& a ) {
00067 typename Darray<Logic_t>::DataType tmp;
00068 tmp = 0;
00069 for( int i=0; i < a.Size(); i++ ) tmp |= a[i];
00070 return tmp;
00071 };
00072
00073 template<class Logic_t>
00074 typename Darray<Logic_t>::DataType
00075 MAll( const bool* mask, Darray<Logic_t>& a ) {
00076 typename Darray<Logic_t>::DataType tmp;
00077 tmp = 1;
00078 for( int i = 0; i < a.Size(); i++) if (mask[i]) tmp &= a[i];
00079 return tmp;
00080 };
00081
00082 template<class Logic_t>
00083 typename Darray<Logic_t>::DataType
00084 MAny( const bool& mask, Darray<Logic_t>& a ) {
00085 typename Darray<Logic_t>::DataType tmp;
00086 tmp = 0;
00087 for( int i = 0; i < a.Size(); i++ ) if ( mask[i] ) tmp |= a[i];
00088 return tmp;
00089 };
00090
00091
00092
00093 template<class Logic_t>
00094 Darray<Logic_t> Not(Darray<Logic_t>& a ) {
00095 Darray<Logic_t> tmp( a.Size() );
00096 for( int i = 0; i < a.Size(); i++) tmp[i] = ~a[i] ;
00097 return tmp;
00098 };
00099
00100 template<class Logic_t>
00101 Darray<Logic_t> And( Darray<Logic_t>& a, Darray<Logic_t>& b ) {
00102 Darray<Logic_t> tmp( a.Size() );
00103 for( int i = 0; i < a.Size(); i++ ) tmp[i] = a[i] & b[i] ;
00104 return tmp;
00105 };
00106
00107 template<class Logic_t>
00108 Darray<Logic_t> Or( Darray<Logic_t>& a, Darray<Logic_t>& b ) {
00109 Darray<Logic_t> tmp( a.Size() );
00110 if ( a.Size() == b.Size() ) {
00111 for( int i = 0; i < a.Size(); i++ ) tmp[i] = a[i] | b[i] ;
00112 } else {
00113 for( int i = 0; i < a.Size(); i++ ) tmp[i] = 0;
00114 }
00115 return tmp;
00116 };
00117
00118 template<class Logic_t>
00119 Darray<Logic_t> Xor(Darray<Logic_t>& a, Darray<Logic_t>& b ) {
00120 Darray<Logic_t> tmp(a.Size());
00121 if ( a.Size() == b.Size() ) {
00122 for( int i = 0; i < a.Size(); i++ ) tmp[i] = a[i] ^ b[i] ;
00123 } else {
00124 for( int i = 0; i < a.Size(); i++ ) tmp[i] = 0;
00125 }
00126 return tmp;
00127 };
00128
00129 template<class Logic_t>
00130 Darray<Logic_t> operator~( Darray<Logic_t>& a ) { return Not(a); };
00131
00132 template<class Logic_t>
00133 Darray<Logic_t>
00134 operator&( Darray<Logic_t>& a, Darray<Logic_t>& b ) {
00135 return And(a,b);
00136 };
00137
00138 template<class Logic_t>
00139 Darray<Logic_t>
00140 operator|( Darray<Logic_t>& a, Darray<Logic_t>& b ) {
00141 return Or(a,b);
00142 };
00143
00144 template<class Logic_t>
00145 Darray<Logic_t>
00146 operator^( Darray<Logic_t>& a, Darray<Logic_t>& b ) {
00147 return Xor(a,b);
00148 };
00149
00150 #endif