00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef RTC_ARRAY2_H
00020 #define RTC_ARRAY2_H
00021
00022
00023 #include "rtc/rtcMath.h"
00024 #include "rtc/rtcVec2.h"
00025 #include "rtc/rtcArray.h"
00026
00027
00028 namespace rtc {
00029
00030
00031 template <class T, int K> class Array;
00032 template <class T> class Array2;
00033 template <class T> class Vec2;
00034
00038 template <class T>
00039 class Array2: public Array<T,2> {
00040 public:
00041
00042 Array2();
00043 Array2(int rows, int columns);
00044 Array2(int rows, int columns, const T* d);
00045 Array2(int rows, int columns, const T a);
00046 Array2(const Array<T,2>& a);
00047
00048
00049 void setSize(int rows, int cols);
00050
00051
00052 int rows() const;
00053 int columns() const;
00054 T& at(int rows, int columns);
00055 const T& at(int rows, int columns) const;
00056 T& operator () (int rows, int columns);
00057 T operator () (int rows, int columns) const;
00058
00059
00060 int indexOf(int rows, int columns) const;
00061
00062
00063 using Array<T,2>::x;
00064 using Array<T,2>::reset;
00065 using Array<T,2>::operator ();
00066 using Array<T,2>::size;
00067 using Array<T,2>::setSize;
00068 using Array<T,2>::at;
00069 protected:
00070
00071 using Array<T,2>::dim;
00072 using Array<T,2>::mul;
00073 using Array<T,2>::len;
00074 };
00075
00076
00077 typedef Array2<bool> Array2b;
00078 typedef Array2<char> Array2c;
00079 typedef Array2<unsigned char> Array2uc;
00080 typedef Array2<int> Array2i;
00081 typedef Array2<float> Array2f;
00082 typedef Array2<double> Array2d;
00083
00084
00085
00086
00087
00088
00089
00092 template <class T>
00093 inline Array2<T>::Array2() : Array<T,2>() {}
00094
00099 template <class T>
00100 inline Array2<T>::Array2(int rows, int columns) : Array<T,2>() {
00101 setSize(rows,columns);
00102 }
00103
00109 template <class T>
00110 inline Array2<T>::Array2(int rows, int columns, const T* d) {
00111 setSize(rows,columns);
00112 Array<T,2>::set(d);
00113 }
00114
00120 template <class T>
00121 inline Array2<T>::Array2(int rows, int columns, const T a) {
00122 setSize(rows,columns);
00123 Array<T,2>::set(a);
00124 }
00125
00129 template <class T>
00130 inline Array2<T>::Array2(const Array<T,2>& a) : Array<T,2>(a) {
00131 }
00132
00133
00134
00139 template <class T>
00140 inline void Array2<T>::setSize(int rows, int columns) {
00141 Array<T,2>::setSize(Vec2i(rows,columns));
00142 }
00143
00149 template <class T>
00150 inline T& Array2<T>::at(int row, int column) {
00151 return x[indexOf(row,column)];
00152 }
00153
00159 template <class T>
00160 inline const T& Array2<T>::at(int row, int column) const {
00161 return x[indexOf(row,column)];
00162 }
00163
00169 template <class T>
00170 inline T& Array2<T>::operator () (int row, int column) {
00171 return x[indexOf(row,column)];
00172 }
00173
00179 template <class T>
00180 inline T Array2<T>::operator () (int row, int column) const {
00181 return x[indexOf(row,column)];
00182 }
00183
00187 template <class T>
00188 inline int Array2<T>::rows() const {
00189 return Array<T,2>::dim[0];
00190 }
00191
00195 template <class T>
00196 inline int Array2<T>::columns() const {
00197 return Array<T,2>::dim[1];
00198 }
00199
00200
00201
00207 template <class T>
00208 inline int Array2<T>::indexOf(int row, int column) const {
00209 #if AR_CHECK_BOUNDS
00210 if (row<0 || row>=dim(0) || column<0 || column>=dim(1)) {
00211 std::stringstream ss;
00212 ss << "Array2: Error. Indices (" << row << ", " << column;
00213 ss << ") exceed bounds [0, ";
00214 ss << dim(0) << "] or [0, " << dim(1) << "].";
00215 ss << std::endl << std::flush;
00216 throw Exception(ss.str());
00217 }
00218 #endif
00219 return row*mul(0)+column;
00220 }
00221
00222
00223 }
00224
00225 #endif // RTC_ARRAY2_H defined
00226
00227