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;
00178 ElemT* mData;
00179 bool mIsWrapper;
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 }
00243 }
00244 }
00245
00246 #endif