00001 #ifndef Impala_Core_Array_Element_VecTem_h
00002 #define Impala_Core_Array_Element_VecTem_h
00003
00004 #include <iostream>
00005 #include "Core/Array/Element/Vec3Int32.h"
00006
00007 namespace Impala
00008 {
00009 namespace Core
00010 {
00011 namespace Array
00012 {
00013 namespace Element
00014 {
00015
00016
00019 template <class ElemT, int vecSize>
00020 class VecTem
00021 {
00022 public:
00023
00024 typedef ElemT ElemType;
00025 static const int VecSize() { return vecSize; }
00026
00028 VecTem()
00029 {
00030 mData = new ElemType[vecSize];
00031 mIsWrapper = false;
00032 }
00033
00035 VecTem(ElemType a0)
00036 {
00037 mData = new ElemType[vecSize];
00038 mIsWrapper = false;
00039 mData[0] = a0;
00040 for (int i=1 ; i<vecSize ; i++)
00041 mData[i] = 0;
00042 }
00043
00045 VecTem(ElemType a0, ElemType a1)
00046 {
00047 mData = new ElemType[vecSize];
00048 mIsWrapper = false;
00049 mData[0] = a0;
00050 mData[1] = a1;
00051 for (int i=2 ; i<vecSize ; i++)
00052 mData[i] = 0;
00053 }
00054
00056 VecTem(ElemType a0, ElemType a1, ElemType a2)
00057 {
00058 mData = new ElemType[vecSize];
00059 mIsWrapper = false;
00060 mData[0] = a0;
00061 mData[1] = a1;
00062 mData[2] = a2;
00063 for (int i=3 ; i<vecSize ; i++)
00064 mData[i] = 0;
00065 }
00066
00068 VecTem(ElemType* a, bool isWrapper)
00069 {
00070 mIsWrapper = isWrapper;
00071 mData = (mIsWrapper) ? a : new ElemType[vecSize];
00072 if (!mIsWrapper)
00073 for (int i=0 ; i<vecSize ; i++)
00074 mData[i] = a[i];
00075 }
00076
00078 VecTem(const VecTem<ElemType,vecSize>& v)
00079 {
00080 mIsWrapper = v.mIsWrapper;
00081 mData = (mIsWrapper) ? v.mData : new ElemType[vecSize];
00082 if (!mIsWrapper)
00083 for (int i=0 ; i<vecSize ; i++)
00084 mData[i] = v.mData[i];
00085 }
00086
00088 ~VecTem()
00089 {
00090 if (!mIsWrapper)
00091 delete [] mData;
00092 }
00093
00095 VecTem<ElemT, vecSize>&
00096 operator=(const VecTem<ElemT, vecSize>& v)
00097 {
00098 if (this != &v)
00099 {
00100 for (int i=0 ; i<vecSize ; i++)
00101 mData[i] = v.mData[i];
00102 }
00103 return *this;
00104 }
00105
00107 VecTem<ElemT, vecSize>&
00108 operator=(const Vec3Int32& v)
00109 {
00110 mData[0] = v.X();
00111 mData[1] = v.Y();
00112 mData[2] = v.Z();
00113 return *this;
00114 }
00115
00117 ElemType&
00118 operator[](int i) const
00119 {
00120 return mData[i];
00121 }
00122
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133 private:
00134
00135 ElemType* mData;
00136 bool mIsWrapper;
00137
00138 };
00139
00140 template <class ElemT, int vecSize>
00141 inline std::ostream&
00142 operator<<(std::ostream& os, const VecTem<ElemT,vecSize>& v)
00143 {
00144 os << "(";
00145 for (int i=0 ; i<vecSize-1 ; i++)
00146 os << v[i] << ",";
00147 return os << v[vecSize-1] << ")";
00148 }
00149
00150 }
00151 }
00152 }
00153 }
00154
00155 #endif