arbeit
Main Page | Namespace List | Class Hierarchy | Alphabetical List | Compound List | File List | Namespace Members | Compound Members | File Members

arrayOwn4.h

Go to the documentation of this file.
00001 /*
00002  * $Id: arrayOwn4.h,v 1.2 2003/06/27 04:58:37 jmk Exp $
00003  */
00004 ///////////////////////////////////////////////////////////////////////////
00005 //              _____________  ______________________    __   __  _____
00006 //             /  ________  |  |   ___   ________   /   |  \ /  \   |
00007 //            |  |       |  |_ |  |_ |  |       /  /    \__  |      |
00008 //            |  |  ___  |  || |  || |  |      /  /        | |      |
00009 //            |  | |   \ |  || |  || |  |     /  /      \__/ \__/ __|__
00010 //            |  | |_@  ||  || |  || |  |    /  /          Institute
00011 //            |  |___/  ||  ||_|  || |  |   /  /_____________________
00012 //             \_______/  \______/ | |__|  /___________________________
00013 //                        |  |__|  |
00014 //                         \______/
00015 //                    University of Utah       
00016 //                           2002
00017 ///////////////////////////////////////////////////////////////////////////
00018 // 8/26/02      Aaron Lefohn    Scientific Computing and Imaging Institute
00019 //                                                      School of Computing
00020 //                                                      University of Utah
00021 // 
00022 // arrayOwn4 - A lightweight 4D array class that OWNS its data.
00023 //                       - Very little (nearly none) error checking
00024 //                       - Designed to act just like a built-in 2D array, but handle memory allocation
00025 //                       - No dynamic resizing of memory. 
00026 //                       - "reshape(d0, d1, d2, d3)" only sets dimensions. It does NOT affect memory allocation.
00027 
00028 #ifndef GLIFT_ARRAY_4_OWN_H_
00029 #define GLIFT_ARRAY_4_OWN_H_
00030 
00031 #include "arrayWrap4.h"
00032 #include <assert.h>
00033 
00034 namespace gutz {
00035 
00036 ////////////////////////////////////
00037 // ArrayOwn4  
00038 ////////////////////////////////////
00039 
00040 template <class T>
00041 class arrayOwn4 : public arrayWrap4<T>
00042 {
00043 public:
00044         // Constructors - Deep copies of input data
00045     arrayOwn4 ();
00046     arrayOwn4 (int d0, int d1, int d2, int d3, T v ); 
00047         arrayOwn4 (int d0, int d1, int d2, int d3, const T* v);
00048         arrayOwn4 ( const arrayWrap4<T>& a );
00049 
00050         // Copy Constructor, Assignment Operator, and Destructor
00051     arrayOwn4 (const arrayOwn4<T>& a);
00052     arrayOwn4<T>& operator= (const arrayOwn4<T>& a);
00053     ~arrayOwn4() {killData();}
00054 
00055         // Transfer ownership of data ('v') to this object.
00056         // - Destroys previous contents of 'this' before doing shallow copy of new data
00057         // - 'killWithDelete' is true if 'v' is allocated with 'new', otherwise false ('malloc')
00058         void transfer( int d0, int d1, int d3, int d4, T* v, bool killWithDelete );
00059 
00060 private:
00061         void initVal (T v);
00062         void initData (const T* d);
00063     void copy (const arrayOwn4<T>& a);
00064 };
00065 
00066 ////////////////////////////////////
00067 // Implementation
00068 ////////////////////////////////////
00069 
00070 // Constructors
00071 template <class T>
00072 arrayOwn4<T>::arrayOwn4()
00073                         : arrayWrap4<T>()
00074 {}
00075 
00076 template <class T>
00077 arrayOwn4<T>::arrayOwn4 (int d0, int d1, int d2, int d3, T val)
00078                         : arrayWrap4<T>(d0, d1, d2, d3, NULL)
00079 {
00080     arrayBase<T>::initValOwn( val );
00081 }
00082 
00083 template <class T>
00084 arrayOwn4<T>::arrayOwn4 (int d0, int d1, int d2, int d3, const T* data)
00085                         : arrayWrap4<T>(d0, d1, d2, d3, NULL)
00086 {
00087         arrayBase<T>::initDataOwn( data );
00088 }
00089 
00090 template <class T>
00091 arrayOwn4<T>::arrayOwn4 ( const arrayWrap4<T>& a ) : arrayWrap4<T>(a)
00092 {
00093         arrayBase<T>::initDataOwn( a.data() );
00094 }
00095 
00096 // Copy Constructor
00097 template <class T>
00098 arrayOwn4<T>::arrayOwn4 (const arrayOwn4<T>& a) : arrayWrap4<T>(a)
00099                                                                                                  // Shallow copy of a
00100 {
00101         arrayBase<T>::initDataOwn(a.mData);                      // DEEP copy of a
00102 }
00103     
00104 // Assignment Operator
00105 template <class T>
00106 arrayOwn4<T>& arrayOwn4<T>::operator= (const arrayOwn4<T>& a) 
00107 { 
00108         if( &a != this ) {
00109                 if( (mSize != a.size() ) || 
00110                         (dim(0) != a.dim(0)) ||
00111                         (dim(1) != a.dim(1)) ||
00112                         (dim(2) != a.dim(2)) ||
00113                         (dim(3) != a.dim(3)) ) {
00114                         killData();     
00115                         arrayWrap4<T>::operator=(a);            // SHALLOW copy of a
00116                         arrayBase<T>::allocDataOwn();
00117                 }
00118                 arrayBase<T>::copyDataOwn(a.mData);     // Deep copy of a.mData
00119         }
00120         return *this; 
00121 }
00122 
00123 // Transfer ownership of data ('v') to this object.
00124 // - Destroys previous contents of 'this' before doing shallow copy of new data
00125 template <class T>
00126 void arrayOwn4<T>::transfer( int d0, int d1, int d2, int d3, T* v, bool killDataWithDelete )
00127 {
00128         killData();
00129         
00130         int sizes[4];
00131         sizes[0] = d0;
00132         sizes[1] = d1;
00133         sizes[2] = d2;
00134         sizes[3] = d3;
00135 
00136         set(4, sizes, v);
00137         mSlice = arrayWrap3<T>(d1,d2,d3,v);
00138         mKillWithDelete = killDataWithDelete;
00139 }
00140 
00141 
00142 
00143 ////////////////////////////////////
00144 // Typedefs
00145 ////////////////////////////////////
00146 
00147 typedef arrayOwn4<char>         arrayo4c;
00148 typedef arrayOwn4<uchar>        arrayo4uc;
00149 typedef arrayOwn4<char>         arrayo4b;
00150 typedef arrayOwn4<uchar>        arrayo4ub;
00151 typedef arrayOwn4<short>        arrayo4s;
00152 typedef arrayOwn4<ushort>       arrayo4us;
00153 typedef arrayOwn4<int>          arrayo4i;
00154 typedef arrayOwn4<uint>         arrayo4ui;
00155 typedef arrayOwn4<long>         arrayo4l;
00156 typedef arrayOwn4<ulong>        arrayo4ul;
00157 typedef arrayOwn4<llong>        arrayo4ll;
00158 typedef arrayOwn4<ullong>       arrayo4ull;
00159 typedef arrayOwn4<float>        arrayo4f;
00160 typedef arrayOwn4<double>       arrayo4d;
00161 
00162 #ifdef USING_MATHGUTZ
00163         typedef arrayOwn4<vec2ub>       arrayo4v2ub;
00164         typedef arrayOwn4<vec2i>        arrayo4v2i;
00165         typedef arrayOwn4<vec2ui>       arrayo4v2ui;
00166         typedef arrayOwn4<vec2f>        arrayo4v2f;
00167 
00168         typedef arrayOwn4<vec3ub>       arrayo4v3ub;
00169         typedef arrayOwn4<vec3i>        arrayo4v3i;
00170         typedef arrayOwn4<vec3ui>       arrayo4v3ui;
00171         typedef arrayOwn4<vec3f>        arrayo4v3f;
00172 
00173         typedef arrayOwn4<vec4ub>       arrayo4v4ub;
00174         typedef arrayOwn4<vec4i>        arrayo4v4i;
00175         typedef arrayOwn4<vec4ui>       arrayo4v4ui;
00176         typedef arrayOwn4<vec4f>        arrayo4v4f;
00177 
00178         typedef arrayOwn4<mat2ub>       arrayo4m2ub;
00179         typedef arrayOwn4<mat2i>        arrayo4m2i;
00180         typedef arrayOwn4<mat2ui>       arrayo4m2ui;
00181         typedef arrayOwn4<mat2f>        arrayo4m2f;
00182 
00183         typedef arrayOwn4<mat3ub>       arrayo4m3ub;
00184         typedef arrayOwn4<mat3i>        arrayo4m3i;
00185         typedef arrayOwn4<mat3ui>       arrayo4m3ui;
00186         typedef arrayOwn4<mat3f>        arrayo4m3f;
00187 
00188         typedef arrayOwn4<mat4ub>       arrayo4m4ub;
00189         typedef arrayOwn4<mat4i>        arrayo4m4i;
00190         typedef arrayOwn4<mat4ui>       arrayo4m4ui;
00191         typedef arrayOwn4<mat4f>        arrayo4m4f;
00192 #endif
00193 
00194 } // End of namespace gutz
00195 
00196 #endif // arrayOwn4_h

Send questions, comments, and bug reports to:
jmk