Home || Architecture || Video Search || Visual Search || Scripts || Applications || Important Messages || OGL || Src

VectorTem.h

Go to the documentation of this file.
00001 #ifndef Impala_Core_Vector_VectorTem_h
00002 #define Impala_Core_Vector_VectorTem_h
00003 
00004 #include <iostream>
00005 
00006 namespace Impala
00007 {
00008 namespace Core
00009 {
00010 namespace Vector
00011 {
00012 
00013 
00017 template <class ElemT>
00018 class VectorTem
00019 {
00020 public:
00021 
00023     VectorTem()
00024     {
00025         mSize = 0;
00026         mData = 0;
00027         mIsWrapper = false;
00028     }
00029 
00031     VectorTem(int n)
00032     {
00033         mSize = n;
00034         mData = new ElemT[mSize];
00035         mIsWrapper = false;
00036     }
00037 
00039     VectorTem(int n, ElemT* data, bool isWrapper)
00040     {
00041         mSize = n;
00042         mIsWrapper = isWrapper;
00043         mData = (mIsWrapper) ? data : new ElemT[n];
00044         if (!mIsWrapper)
00045             CopyData(n, data);
00046     }
00047 
00049     VectorTem(ElemT a0, ElemT a1)
00050     {
00051         mSize = 2;
00052         mData = new ElemT[mSize];
00053         mIsWrapper = false;
00054         mData[0] = a0;
00055         mData[1] = a1;
00056     }
00057 
00059     VectorTem(ElemT a0, ElemT a1, ElemT a2)
00060     {
00061         mSize = 3;
00062         mData = new ElemT[mSize];
00063         mIsWrapper = false;
00064         mData[0] = a0;
00065         mData[1] = a1;
00066         mData[2] = a2;
00067     }
00068 
00070     VectorTem(const VectorTem& v)
00071     {
00072         mSize = v.mSize;
00073         mIsWrapper = v.mIsWrapper;
00074         mData = (mIsWrapper) ? v.mData : new ElemT[mSize];
00075         if (!mIsWrapper)
00076             CopyData(mSize, v.mData);
00077     }
00078 
00080     virtual
00081     ~VectorTem()
00082     { 
00083         if (!mIsWrapper)
00084             delete [] mData; 
00085     }
00086 
00088     int
00089     Size() const
00090     { 
00091         return mSize; 
00092     }
00093 
00095     int
00096     Valid() const
00097     {
00098         return (mSize != 0);
00099     }
00100 
00102     VectorTem&
00103     operator=(const VectorTem& v)
00104     {
00105         if (this != &v)
00106         {
00107             if ((mSize != v.mSize) && (!mIsWrapper))
00108             {
00109                 delete [] mData;
00110                 mSize = v.mSize;
00111                 mData = new ElemT[mSize];
00112             }
00113             CopyData(mSize, v.mData);
00114         }
00115         return *this;
00116     }
00117 
00119     void
00120     CopyData(int n, const ElemT* data, int begin=0)
00121     {
00122         for (int i=0 ; i<n && i+begin<Size() ; i++)
00123             mData[i+begin] = data[i];
00124     }
00125 
00127     VectorTem&
00128     operator=(ElemT a)
00129     {
00130         for (int i=0 ; i<mSize ; i++)
00131             mData[i] = a;
00132         return *this;
00133     }
00134 
00136     ElemT&
00137     operator[](int i) const
00138     {
00139         return mData[i];
00140     }
00141 
00142     ElemT&
00143     Elem(int i) const
00144     {
00145         return mData[i];
00146     }
00147 
00148     ElemT*
00149     GetData()
00150     {
00151         return mData;
00152     }
00153 
00154     const ElemT*
00155     GetData() const
00156     {
00157         return mData;
00158     }
00159 
00161     template<class ElemTT>
00162     friend ElemTT
00163     operator*(const VectorTem<ElemTT>& a, const VectorTem<ElemTT>& b);
00164 
00166     template<class ElemTT>
00167     friend VectorTem<ElemTT>
00168     operator*(const ElemTT a, const VectorTem<ElemTT>& b);
00169 
00171     template<class ElemTT>
00172     friend VectorTem<ElemTT>
00173     operator*(const VectorTem<ElemTT>& a, const ElemTT b);
00174 
00175 private:
00176 
00177     int    mSize;      // number of elements
00178     ElemT* mData;      // data pointer
00179     bool   mIsWrapper; // indicates whether we own mData
00180 };
00181 
00182 template <class ElemT>
00183 VectorTem<ElemT> Append(const VectorTem<ElemT>& v1, const VectorTem<ElemT>& v2)
00184 {
00185     VectorTem<ElemT> ret(v1.Size() + v2.Size());
00186     ret.CopyData(v1.Size(), v1.GetData());
00187     ret.CopyData(v2.Size(), v2.GetData(), v1.Size());
00188     return ret;
00189 }
00190 
00191 template <class ElemT>
00192 inline std::ostream&
00193 operator<<(std::ostream& os, const VectorTem<ElemT>& v)
00194 {
00195     os << "(";
00196     for (int i=0 ; i<v.Size() ; i++)
00197     {
00198         os << v[i];
00199         if (i != v.Size() - 1)
00200             os << ",";
00201     }
00202     os << ")";
00203     return os;
00204 }
00205 
00206 template <class ElemT>
00207 inline VectorTem<ElemT>
00208 operator*(const VectorTem<ElemT>& a, ElemT b)
00209 {
00210     VectorTem<ElemT> r(a);
00211     for (int i=0 ; i<r.mSize ; i++)
00212         r.mData[i] *= b;
00213     return r;
00214 }
00215 
00216 template <class ElemT>
00217 inline VectorTem<ElemT>
00218 operator*(ElemT a, const VectorTem<ElemT> &b)
00219 {
00220     VectorTem<ElemT> r(b);
00221     for (int i=0 ; i<r.mSize ; i++)
00222         r.mData[i] *= a;
00223     return r;
00224 }
00225 
00226 template <class ElemT>
00227 inline ElemT
00228 operator*(const VectorTem<ElemT> &a, const VectorTem<ElemT> &b)
00229 {
00230     if (a.mSize != b.mSize)
00231     {
00232         std::cerr << "nonconformant VectorTem * VectorTem operands." << std::endl;
00233         return 0;
00234     }
00235     ElemT sum = 0;
00236     int i;
00237     for (i=0 ; i<a.mSize ; i++)
00238         sum += a[i] * b[i];
00239     return sum;
00240 }
00241 
00242 } // namespace Vector
00243 } // namespace Core
00244 } // namespace Impala
00245 
00246 #endif

Generated on Fri Mar 19 09:31:29 2010 for ImpalaSrc by  doxygen 1.5.1