// // Simple vector and matrix classes // // Copyright (c) 2005 Shinji Tamura // #ifndef _FARRAY #define _FARRAY #include #ifdef FARRAY_DEBUG #include #endif /* FARRAY_DEBUG */ #ifndef FARRAY_OFFSET #ifdef FARRAY_INIT0 #define FARRAY_OFFSET 0 #else #define FARRAY_OFFSET 1 #endif /* FARRAY_INIT0 */ #endif /* FARRAY_OFFSET */ template class fvector { private: T *vec; fvector(const fvector&); fvector& operator= (const fvector&); #ifdef FARRAY_DEBUG size_t d; inline void fvector_check_subscript(size_t i) const { if (i < FARRAY_OFFSET || i >= d + FARRAY_OFFSET) { throw std::out_of_range("fvector: subscript out of range"); } } public: inline size_t size(void) const { return d; } #define FVECTOR_SET_D d = i; #define FVECTOR_CHECK_SUBSCRIPT fvector_check_subscript(i); #else #define FVECTOR_SET_D #define FVECTOR_CHECK_SUBSCRIPT public: #endif /* FARRAY_DEBUG */ inline fvector(size_t i) { vec = new T[i]; FVECTOR_SET_D } inline ~fvector(void) { delete[] vec; } inline T* operator() (void) const { return vec; } inline T operator() (size_t i) const { FVECTOR_CHECK_SUBSCRIPT return vec[i - FARRAY_OFFSET]; } inline T& operator() (size_t i) { FVECTOR_CHECK_SUBSCRIPT return vec[i - FARRAY_OFFSET]; } }; template class fmatrix { private: T *mat; size_t d1; fmatrix(const fmatrix&); fmatrix& operator= (const fmatrix&); #ifdef FARRAY_DEBUG size_t d2; inline void fmatrix_check_subscripts(size_t i1, size_t i2) const { if (i1 < FARRAY_OFFSET || i1 >= d1 + FARRAY_OFFSET) { throw std::out_of_range("fmatrix: 1st subscript out of range"); } else if (i2 < FARRAY_OFFSET || i2 >= d2 + FARRAY_OFFSET) { throw std::out_of_range("fmatrix: 2nd subscript out of range"); } } public: inline size_t size(void) const { return d1 * d2; } inline size_t dim1(void) const { return d1; } inline size_t dim2(void) const { return d2; } #define FMATRIX_SET_D2 d2 = i2; #define FMATRIX_CHECK_SUBSCRIPTS fmatrix_check_subscripts(i1, i2); #else #define FMATRIX_SET_D2 #define FMATRIX_CHECK_SUBSCRIPTS public: #endif /* FARRAY_DEBUG */ inline fmatrix(size_t i1, size_t i2) { mat = new T[i1 * i2]; d1 = i1; FMATRIX_SET_D2 } inline ~fmatrix(void) { delete[] mat; } inline T* operator() (void) const { return mat; } inline T operator() (size_t i1, size_t i2) const { FMATRIX_CHECK_SUBSCRIPTS return mat[i1 - FARRAY_OFFSET + (i2 - FARRAY_OFFSET) * d1]; } inline T& operator() (size_t i1, size_t i2) { FMATRIX_CHECK_SUBSCRIPTS return mat[i1 - FARRAY_OFFSET + (i2 - FARRAY_OFFSET) * d1]; } }; #endif /* _FARRAY */ // // Local Variables: // mode: C++ // End: