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