00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef _ARRAY3_H_
00012 #define _ARRAY3_H_
00013
00014 #include "lib/common.h"
00015 #include "base/SGObject.h"
00016 #include "lib/Array.h"
00017
00018 template <class T> class CArray3;
00019
00020
00027 template <class T> class CArray3: public CArray<T>
00028 {
00029 public:
00031 CArray3()
00032 : CArray<T>(1), dim1_size(1), dim2_size(1), dim3_size(1)
00033 {
00034 }
00035
00042 CArray3(int32_t dim1, int32_t dim2, int32_t dim3)
00043 : CArray<T>(dim1*dim2*dim3), dim1_size(dim1), dim2_size(dim2), dim3_size(dim3)
00044 {
00045 }
00046
00056 CArray3(T* p_array, int32_t dim1, int32_t dim2, int32_t dim3,
00057 bool p_free_array=true, bool p_copy_array=false)
00058 : CArray<T>(p_array, dim1*dim2*dim3, p_free_array, p_copy_array),
00059 dim1_size(dim1), dim2_size(dim2), dim3_size(dim3)
00060 {
00061 }
00062
00063
00071 CArray3(const T* p_array, int32_t dim1, int32_t dim2, int32_t dim3)
00072 : CArray<T>(p_array, dim1*dim2*dim3),
00073 dim1_size(dim1), dim2_size(dim2), dim3_size(dim3)
00074 {
00075 }
00076
00077 ~CArray3() {}
00078
00083 inline void set_name(const char * p_name)
00084 {
00085 CArray<T>::set_name(p_name);
00086 }
00087
00094 inline void get_array_size(int32_t & dim1, int32_t & dim2, int32_t & dim3)
00095 {
00096 dim1=dim1_size;
00097 dim2=dim2_size;
00098 dim3=dim3_size;
00099 }
00100
00105 inline int32_t get_dim1() { return dim1_size; }
00106
00111 inline int32_t get_dim2() { return dim2_size; }
00112
00117 inline int32_t get_dim3() { return dim3_size ;
00118 }
00119
00121 inline void zero() { CArray<T>::zero(); }
00122
00130 inline T* get_array() { return CArray<T>::array; }
00131
00141 inline void set_array(T* p_array, int32_t dim1, int32_t dim2, int32_t dim3, bool p_free_array, bool copy_array=false)
00142 {
00143 dim1_size=dim1;
00144 dim2_size=dim2;
00145 dim3_size=dim3;
00146 CArray<T>::set_array(p_array, dim1*dim2*dim3, p_free_array, copy_array);
00147 }
00148
00156 inline bool resize_array(int32_t dim1, int32_t dim2, int32_t dim3)
00157 {
00158 dim1_size=dim1;
00159 dim2_size=dim2;
00160 dim3_size=dim3;
00161 return CArray<T>::resize_array(dim1*dim2*dim3);
00162 }
00163
00171 inline T get_element(int32_t idx1, int32_t idx2, int32_t idx3) const
00172 {
00173 ARRAY_ASSERT(idx1>=0 && idx1<dim1_size);
00174 ARRAY_ASSERT(idx2>=0 && idx2<dim2_size);
00175 ARRAY_ASSERT(idx3>=0 && idx3<dim3_size);
00176 return CArray<T>::get_element(idx1+dim1_size*(idx2+dim2_size*idx3));
00177 }
00178
00187 inline bool set_element(T p_element, int32_t idx1, int32_t idx2, int32_t idx3)
00188 {
00189 ARRAY_ASSERT(idx1>=0 && idx1<dim1_size);
00190 ARRAY_ASSERT(idx2>=0 && idx2<dim2_size);
00191 ARRAY_ASSERT(idx3>=0 && idx3<dim3_size);
00192 return CArray<T>::set_element(p_element, idx1+dim1_size*(idx2+dim2_size*idx3));
00193 }
00194
00202 inline const T& element(int32_t idx1, int32_t idx2, int32_t idx3) const
00203 {
00204 ARRAY_ASSERT(idx1>=0 && idx1<dim1_size);
00205 ARRAY_ASSERT(idx2>=0 && idx2<dim2_size);
00206 ARRAY_ASSERT(idx3>=0 && idx3<dim3_size);
00207 return CArray<T>::element(idx1+dim1_size*(idx2+dim2_size*idx3));
00208 }
00209
00217 inline T& element(int32_t idx1, int32_t idx2, int32_t idx3)
00218 {
00219 ARRAY_ASSERT(idx1>=0 && idx1<dim1_size);
00220 ARRAY_ASSERT(idx2>=0 && idx2<dim2_size);
00221 ARRAY_ASSERT(idx3>=0 && idx3<dim3_size);
00222 return CArray<T>::element(idx1+dim1_size*(idx2+dim2_size*idx3));
00223 }
00224
00233 inline T& element(T* p_array, int32_t idx1, int32_t idx2, int32_t idx3)
00234 {
00235 ARRAY_ASSERT(p_array==CArray<T>::array);
00236 ARRAY_ASSERT(idx1>=0 && idx1<dim1_size);
00237 ARRAY_ASSERT(idx2>=0 && idx2<dim2_size);
00238 ARRAY_ASSERT(idx3>=0 && idx3<dim3_size);
00239 return p_array[idx1+dim1_size*(idx2+dim2_size*idx3)];
00240 }
00241
00252 inline T& element(T* p_array, int32_t idx1, int32_t idx2, int32_t idx3, int32_t p_dim1_size, int32_t p_dim2_size)
00253 {
00254 ARRAY_ASSERT(p_array==CArray<T>::array);
00255 ARRAY_ASSERT(p_dim1_size==dim1_size);
00256 ARRAY_ASSERT(p_dim2_size==dim2_size);
00257 ARRAY_ASSERT(idx1>=0 && idx1<p_dim1_size);
00258 ARRAY_ASSERT(idx2>=0 && idx2<p_dim2_size);
00259 ARRAY_ASSERT(idx3>=0 && idx3<dim3_size);
00260 return p_array[idx1+p_dim1_size*(idx2+p_dim2_size*idx3)];
00261 }
00262
00268 CArray3<T>& operator=(const CArray3<T>& orig)
00269 {
00270 CArray<T>::operator=(orig);
00271 dim1_size=orig.dim1_size;
00272 dim2_size=orig.dim2_size;
00273 dim3_size=orig.dim3_size;
00274 return *this;
00275 }
00276
00278 void display_size() const
00279 {
00280 CArray<T>::SG_PRINT( "3d-Array of size: %dx%dx%d\n",dim1_size, dim2_size, dim3_size);
00281 }
00282
00284 void display_array() const
00285 {
00286 if (CArray<T>::get_name())
00287 CArray<T>::SG_PRINT( "3d-Array '%s' of size: %dx%dx%d\n", CArray<T>::get_name(), dim1_size, dim2_size, dim3_size);
00288 else
00289 CArray<T>::SG_PRINT( "2d-Array of size: %dx%dx%d\n",dim1_size, dim2_size, dim3_size);
00290 for (int32_t k=0; k<dim3_size; k++)
00291 for (int32_t i=0; i<dim1_size; i++)
00292 {
00293 CArray<T>::SG_PRINT( "element(%d,:,%d) = [ ",i, k);
00294 for (int32_t j=0; j<dim2_size; j++)
00295 CArray<T>::SG_PRINT( "%1.1f,", (float32_t)element(i,j,k));
00296 CArray<T>::SG_PRINT( " ]\n");
00297 }
00298 }
00299
00300 protected:
00302 int32_t dim1_size;
00304 int32_t dim2_size;
00306 int32_t dim3_size;
00307 };
00308 #endif