00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 namespace sc {
00029
00030 template <class Type>
00031 class Array2 {
00032 protected:
00033 int _length0;
00034 int _length1;
00035 int _managed;
00036 Type * _array;
00037 public:
00038 Array2():_length0(0),_length1(0),_array(0) {}
00039 Array2(const Array2<Type> &a): _length0(0),_length1(0),_array(0) {
00040 operator=(a);
00041 }
00042 Array2(Type* data,int size0,int size1):
00043 _length0(size0),_length1(size1),_managed(0),_array(data) {}
00044 Array2(int size0,int size1): _length0(0),_length1(0),_array(0) {
00045 set_lengths(size0,size1);
00046 }
00047 ~Array2() { clear(); }
00048 int length0() const { return _length0; };
00049 int length1() const { return _length1; };
00050 void clear() { set_lengths(0,0); }
00051 void set_lengths(int size0,int size1) {
00052 if (_managed && _array) delete[] _array;
00053 _managed = 1;
00054 if (size0*size1) _array = new Type [ size0*size1 ];
00055 else _array = 0;
00056 _length0 = size0;
00057 _length1 = size1;
00058 }
00059 Array2<Type>& operator = (const Array2<Type> & s) {
00060 if (_managed && _array) delete[] _array;
00061 _managed = 1;
00062 _length0 = s._length0;
00063 _length1 = s._length1;
00064 if (_length0*_length1) _array = new Type [ _length0*_length1 ];
00065 else _array = 0;
00066 for (int i=0; i<_length0*_length1; i++) {
00067 _array[i] = s._array[i];
00068 }
00069 return (*this);
00070 }
00071 Type& operator() (int i,int j) {
00072 if (i<0 || i>=_length0 || j<0 || j>=_length1) {
00073 ExEnv::err0() << "Array2::operator()(" << i << "," << j << "): "
00074 << "out of range (" << _length0 << "," << _length1
00075 << ",)" << std::endl;
00076 abort();
00077 };
00078 return _array[i*_length1+j];
00079 }
00080 const Type& operator() (int i,int j) const {
00081 if (i<0 || i>=_length0 || j<0 || j>=_length1) {
00082 ExEnv::err0() << "Array2::operator()(" << i << "," << j << "): "
00083 << "out of range (" << _length0 << "," << _length1
00084 << ",)" << std::endl;
00085 abort();
00086 };
00087 return _array[i*_length1+j];
00088 }
00089 };
00090
00091 }
00092
00093
00094
00095
00096
00097
00098