00001
00045
00046
00047
00048 #ifndef __ARRAY_TABLE_H
00049 #define __ARRAY_TABLE_H
00050
00051 #include "Array/Array.h"
00052
00053
00084 template<class T>
00085
00086 class ArrayTable
00087 {
00088
00089 public:
00090
00091
00109 Array<T> A;
00110
00111
00130 Array<T*> P1;
00131
00132
00150 Array<T**> P2;
00151
00152
00153
00181 void resize(unsigned d0, unsigned d1, unsigned d2, int dummy = 0)
00182 {
00183 unsigned i, j;
00184 A.resize(d0, d1, d2, false);
00185 P1.resize(d0, d1, false);
00186 P2.resize(d0, false);
00187 for (i = 0;i < d0;i++) {
00188 for (j = 0;j < d1;j++) P1(i, j) = &A(i, j, 0);
00189 P2(i) = &P1(i, 0);
00190 }
00191 }
00192
00193
00219 void resize(unsigned d0, unsigned d1, int dummy = 0)
00220 {
00221 unsigned i;
00222 A.resize(d0, d1, false);
00223 P1.resize(d0, false);
00224 P2.resize(0, false);
00225 for (i = 0;i < d0;i++) P1(i) = &A(i, 0);
00226 }
00227
00228
00252 void resize(unsigned d0, int dummy = 0)
00253 {
00254 A.resize(d0, false);
00255 P1.resize(0, false);
00256 P2.resize(0, false);
00257 }
00258
00259
00260
00296 operator T*()
00297 {
00298 return A.elemvec();
00299 }
00300
00301
00302
00347 operator T**()
00348 {
00349 return P1.elemvec();
00350 }
00351
00352
00353
00403 operator T***()
00404 {
00405 return P2.elemvec();
00406 }
00407
00408
00409
00434 T& operator()(unsigned i)
00435 {
00436 return A(i);
00437 }
00438
00439
00440
00467 T& operator()(unsigned i,unsigned j)
00468 {
00469 return P1(i)[j];
00470 }
00471
00472
00473
00502 T& operator()(unsigned i,unsigned j, unsigned k)
00503 {
00504 return P2(i)[j][k];
00505 }
00506
00507
00508
00532 ArrayTable<T>& operator =(const ArrayTable<T>& a)
00533 {
00534 if (a.A.ndim() == 3) resize(a.A.dim(0), a.A.dim(1), a.A.dim(2), false);
00535 else {
00536 if (a.A.ndim() == 2) resize(a.A.dim(0), a.A.dim(1), false);
00537 else if (a.A.ndim() == 1) resize(a.A.dim(0), false);
00538 }
00539 A = a.A;
00540 return *this;
00541 }
00542
00543
00565 ArrayTable<T>& operator =(const T& d)
00566 {
00567 for (unsigned i = 0;i < A.nelem();i++) A.elem(i) = d;
00568 return *this;
00569 }
00570
00571
00572
00573
00590 ArrayTable()
00591 { }
00592
00593
00611 ArrayTable(unsigned i)
00612 {
00613 resize(i);
00614 }
00615
00616
00617
00636 ArrayTable(unsigned i, unsigned j)
00637 {
00638 resize(i, j);
00639 }
00640
00641
00642
00662 ArrayTable(unsigned i, unsigned j, unsigned k)
00663 {
00664 resize(i, j, k);
00665 }
00666
00667
00683 ArrayTable(const ArrayTable<T>& a)
00684 {
00685 operator = (a);
00686 }
00687
00688
00689 };
00690
00691
00692 #endif // __ARRAY_TABLE_H
00693