00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 #ifndef GLIFT_ARRAY_3_OWN_H_
00029 #define GLIFT_ARRAY_3_OWN_H_
00030 
00031 #include "arrayWrap3.h"
00032 #include <assert.h>
00033 
00034 namespace gutz {
00035 
00036 
00037 
00038 
00039 
00040 template <class T>
00041 class arrayOwn3 : public arrayWrap3<T>
00042 {
00043 public:
00044         
00045     arrayOwn3 ();
00046     arrayOwn3 (int d0, int d1, int d2, T v ); 
00047         arrayOwn3 (int d0, int d1, int d3, const T* v);
00048         arrayOwn3 ( const arrayWrap3<T>& a );
00049 
00050         
00051     arrayOwn3 (const arrayOwn3<T>& a);
00052     arrayOwn3<T>& operator= (const arrayOwn3<T>& a);
00053     ~arrayOwn3() {killData();}
00054 
00055         
00056         
00057         
00058         void transfer( int d0, int d1, int d3, T* v, bool killWithDelete );
00059 
00060 private:
00061         void initVal (T v);
00062         void initData (const T* d);
00063     void copy (const arrayOwn3<T>& a);
00064 };
00065 
00066 
00067 
00068 
00069 
00070 
00071 template <class T>
00072 arrayOwn3<T>::arrayOwn3()
00073                                 : arrayWrap3<T>()
00074 {}
00075 
00076 template <class T>
00077 arrayOwn3<T>::arrayOwn3 (int d0, int d1, int d2, T val)
00078                                 : arrayWrap3<T>(d0,d1,d2,NULL)
00079 {
00080     arrayBase<T>::initValOwn( val );
00081 }
00082 
00083 template <class T>
00084 arrayOwn3<T>::arrayOwn3 (int d0, int d1, int d2, const T* data)
00085                                 : arrayWrap3<T>(d0,d1,d2,NULL)
00086 {
00087         arrayBase<T>::initDataOwn( data );
00088 }
00089 
00090 template <class T>
00091 arrayOwn3<T>::arrayOwn3 ( const arrayWrap3<T>& a ) : arrayWrap3<T>(a)
00092 { 
00093         arrayBase<T>::initDataOwn( a.data() );
00094 }
00095 
00096 
00097 template <class T>
00098 arrayOwn3<T>::arrayOwn3 (const arrayOwn3<T>& a) : arrayWrap3<T>(a)
00099                                                                                                  
00100 {
00101         arrayBase<T>::initDataOwn(a.mData);                      
00102 }
00103     
00104 
00105 template <class T>
00106 arrayOwn3<T>& arrayOwn3<T>::operator= (const arrayOwn3<T>& a) 
00107 { 
00108         if( &a != this ) {
00109                                 
00110                 if( (mSize != a.size() ) || 
00111                         (dim(0) != a.dim(0)) ||
00112                         (dim(1) != a.dim(1)) ||
00113                         (dim(2) != a.dim(2)) ) {
00114                         killData();
00115                         arrayWrap3<T>::operator=(a);    
00116                         arrayBase<T>::allocDataOwn();
00117                 }
00118                 arrayBase<T>::copyDataOwn(a.mData);     
00119         }
00120         return *this; 
00121 }
00122 
00123 
00124 
00125 template <class T>
00126 void arrayOwn3<T>::transfer( int d0, int d1, int d2, T* v, bool killWithDelete )
00127 {
00128         killData();
00129         
00130         int sizes[3];
00131         sizes[0] = d0;
00132         sizes[1] = d1;
00133         sizes[2] = d2;
00134 
00135         set(3, sizes, v);
00136         mSlice = arrayWrap2<T>(d1,d2,v);
00137         mKillWithDelete = killWithDelete;
00138 }
00139 
00140 
00141 
00142 
00143 
00144 typedef arrayOwn3<char>         arrayo3c;
00145 typedef arrayOwn3<uchar>        arrayo3uc;
00146 typedef arrayOwn3<char>         arrayo3b;
00147 typedef arrayOwn3<uchar>        arrayo3ub;
00148 typedef arrayOwn3<short>        arrayo3s;
00149 typedef arrayOwn3<ushort>       arrayo3us;
00150 typedef arrayOwn3<int>          arrayo3i;
00151 typedef arrayOwn3<uint>         arrayo3ui;
00152 typedef arrayOwn3<long>         arrayo3l;
00153 typedef arrayOwn3<ulong>        arrayo3ul;
00154 typedef arrayOwn3<llong>        arrayo3ll;
00155 typedef arrayOwn3<ullong>       arrayo3ull;
00156 typedef arrayOwn3<float>        arrayo3f;
00157 typedef arrayOwn3<double>       arrayo3d;
00158 
00159 #ifdef USING_MATHGUTZ
00160         typedef arrayOwn3<vec2ub>       arrayo3v2ub;
00161         typedef arrayOwn3<vec2i>        arrayo3v2i;
00162         typedef arrayOwn3<vec2ui>       arrayo3v2ui;
00163         typedef arrayOwn3<vec2f>        arrayo3v2f;
00164 
00165         typedef arrayOwn3<vec3ub>       arrayo3v3ub;
00166         typedef arrayOwn3<vec3i>        arrayo3v3i;
00167         typedef arrayOwn3<vec3ui>       arrayo3v3ui;
00168         typedef arrayOwn3<vec3f>        arrayo3v3f;
00169 
00170         typedef arrayOwn3<vec4ub>       arrayo3v4ub;
00171         typedef arrayOwn3<vec4i>        arrayo3v4i;
00172         typedef arrayOwn3<vec4ui>       arrayo3v4ui;
00173         typedef arrayOwn3<vec4f>        arrayo3v4f;
00174 
00175         typedef arrayOwn3<mat2ub>       arrayo3m2ub;
00176         typedef arrayOwn3<mat2i>        arrayo3m2i;
00177         typedef arrayOwn3<mat2ui>       arrayo3m2ui;
00178         typedef arrayOwn3<mat2f>        arrayo3m2f;
00179 
00180         typedef arrayOwn3<mat3ub>       arrayo3m3ub;
00181         typedef arrayOwn3<mat3i>        arrayo3m3i;
00182         typedef arrayOwn3<mat3ui>       arrayo3m3ui;
00183         typedef arrayOwn3<mat3f>        arrayo3m3f;
00184 
00185         typedef arrayOwn3<mat4ub>       arrayo3m4ub;
00186         typedef arrayOwn3<mat4i>        arrayo3m4i;
00187         typedef arrayOwn3<mat4ui>       arrayo3m4ui;
00188         typedef arrayOwn3<mat4f>        arrayo3m4f;
00189 #endif
00190 
00191 } 
00192 
00193 #endif // arrayOwn3_h