00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef TNT_FORTRAN_ARRAY3D_H
00023 #define TNT_FORTRAN_ARRAY3D_H
00024
00025 #include <cstdlib>
00026 #include <iostream>
00027 #ifdef TNT_BOUNDS_CHECK
00028 #include <assert.h>
00029 #endif
00030 #include "tnt_i_refvec.h"
00031
00032 namespace TNT
00033 {
00034
00035 template <class T>
00036 class Fortran_Array3D
00037 {
00038
00039
00040 private:
00041
00042
00043 i_refvec<T> v_;
00044 int m_;
00045 int n_;
00046 int k_;
00047 T* data_;
00048
00049 public:
00050
00051 typedef T value_type;
00052
00053 Fortran_Array3D();
00054 Fortran_Array3D(int m, int n, int k);
00055 Fortran_Array3D(int m, int n, int k, T *a);
00056 Fortran_Array3D(int m, int n, int k, const T &a);
00057 inline Fortran_Array3D(const Fortran_Array3D<T> &A);
00058 inline Fortran_Array3D & operator=(const T &a);
00059 inline Fortran_Array3D & operator=(const Fortran_Array3D<T> &A);
00060 inline Fortran_Array3D & ref(const Fortran_Array3D<T> &A);
00061 Fortran_Array3D copy() const;
00062 Fortran_Array3D & inject(const Fortran_Array3D & A);
00063 inline T& operator()(int i, int j, int k);
00064 inline const T& operator()(int i, int j, int k) const ;
00065 inline int dim1() const;
00066 inline int dim2() const;
00067 inline int dim3() const;
00068 inline int ref_count() const;
00069 ~Fortran_Array3D();
00070
00071
00072 };
00073
00074 template <class T>
00075 Fortran_Array3D<T>::Fortran_Array3D() : v_(), m_(0), n_(0), k_(0), data_(0) {}
00076
00077
00078 template <class T>
00079 Fortran_Array3D<T>::Fortran_Array3D(const Fortran_Array3D<T> &A) :
00080 v_(A.v_), m_(A.m_), n_(A.n_), k_(A.k_), data_(A.data_) {}
00081
00082
00083
00084 template <class T>
00085 Fortran_Array3D<T>::Fortran_Array3D(int m, int n, int k) :
00086 v_(m*n*k), m_(m), n_(n), k_(k), data_(v_.begin()) {}
00087
00088
00089
00090 template <class T>
00091 Fortran_Array3D<T>::Fortran_Array3D(int m, int n, int k, const T &val) :
00092 v_(m*n*k), m_(m), n_(n), k_(k), data_(v_.begin())
00093 {
00094 for (T* p = data_; p < data_ + m*n*k; p++)
00095 *p = val;
00096 }
00097
00098 template <class T>
00099 Fortran_Array3D<T>::Fortran_Array3D(int m, int n, int k, T *a) :
00100 v_(a), m_(m), n_(n), k_(k), data_(v_.begin()) {}
00101
00102
00103
00104
00105 template <class T>
00106 inline T& Fortran_Array3D<T>::operator()(int i, int j, int k)
00107 {
00108 #ifdef TNT_BOUNDS_CHECK
00109 assert(i >= 1);
00110 assert(i <= m_);
00111 assert(j >= 1);
00112 assert(j <= n_);
00113 assert(k >= 1);
00114 assert(k <= k_);
00115 #endif
00116
00117 return data_[(k-1)*m_*n_ + (j-1) * m_ + i-1];
00118
00119 }
00120
00121 template <class T>
00122 inline const T& Fortran_Array3D<T>::operator()(int i, int j, int k) const
00123 {
00124 #ifdef TNT_BOUNDS_CHECK
00125 assert(i >= 1);
00126 assert(i <= m_);
00127 assert(j >= 1);
00128 assert(j <= n_);
00129 assert(k >= 1);
00130 assert(k <= k_);
00131 #endif
00132
00133 return data_[(k-1)*m_*n_ + (j-1) * m_ + i-1];
00134 }
00135
00136
00137 template <class T>
00138 Fortran_Array3D<T> & Fortran_Array3D<T>::operator=(const T &a)
00139 {
00140
00141 T *end = data_ + m_*n_*k_;
00142
00143 for (T *p=data_; p != end; *p++ = a);
00144
00145 return *this;
00146 }
00147
00148 template <class T>
00149 Fortran_Array3D<T> Fortran_Array3D<T>::copy() const
00150 {
00151
00152 Fortran_Array3D B(m_, n_, k_);
00153 B.inject(*this);
00154 return B;
00155
00156 }
00157
00158
00159 template <class T>
00160 Fortran_Array3D<T> & Fortran_Array3D<T>::inject(const Fortran_Array3D &A)
00161 {
00162
00163 if (m_ == A.m_ && n_ == A.n_ && k_ == A.k_)
00164 {
00165 T *p = data_;
00166 T *end = data_ + m_*n_*k_;
00167 const T* q = A.data_;
00168 for (; p < end; *p++ = *q++);
00169 }
00170 return *this;
00171 }
00172
00173
00174
00175
00176 template <class T>
00177 Fortran_Array3D<T> & Fortran_Array3D<T>::ref(const Fortran_Array3D<T> &A)
00178 {
00179
00180 if (this != &A)
00181 {
00182 v_ = A.v_;
00183 m_ = A.m_;
00184 n_ = A.n_;
00185 k_ = A.k_;
00186 data_ = A.data_;
00187 }
00188 return *this;
00189 }
00190
00191 template <class T>
00192 Fortran_Array3D<T> & Fortran_Array3D<T>::operator=(const Fortran_Array3D<T> &A)
00193 {
00194 return ref(A);
00195 }
00196
00197 template <class T>
00198 inline int Fortran_Array3D<T>::dim1() const { return m_; }
00199
00200 template <class T>
00201 inline int Fortran_Array3D<T>::dim2() const { return n_; }
00202
00203 template <class T>
00204 inline int Fortran_Array3D<T>::dim3() const { return k_; }
00205
00206
00207 template <class T>
00208 inline int Fortran_Array3D<T>::ref_count() const
00209 {
00210 return v_.ref_count();
00211 }
00212
00213 template <class T>
00214 Fortran_Array3D<T>::~Fortran_Array3D()
00215 {
00216 }
00217
00218
00219 }
00220
00221 #endif
00222
00223