// runtime system for dprog programs. #ifndef CXX_DPROG_HH #define CXX_DPROG_HH #include #include #include #include namespace dprog { // two-dimensional matrix (optimization compared to n-dim. matrix) template class Matrix2 { T *_array; size_t _array_size; // mainly for debugging size_t _row_size; Matrix2(); Matrix2(Matrix2&); public: Matrix2(size_t rows, size_t cols) { _row_size = cols; // there are "cols" columns in each row _array_size = rows * cols; _array = new T[_array_size]; } ~Matrix2() { delete[] _array; } T &cell(int i, int j) { assert(i >= 0); assert(j >= 0); size_t offset = i*_row_size + j; assert(offset < _array_size); return *(_array + offset); } }; // n-dimensional matrix template class Matrix { std::vector _scale; T *_array; size_t _array_size; // mainly for debugging Matrix(); Matrix(Matrix&); public: Matrix(size_t dim, ...) { va_list args; va_start(args, dim); std::vector dimensions; size_t size = 1; for (size_t i = dim; i > 0; --i) { size_t d = va_arg(args, size_t); size *= d; dimensions.push_back(d); } va_end(args); std::vector::iterator i; size_t scale = size; for (i = dimensions.begin(); i != dimensions.end(); ++i) { scale /= *i; _scale.push_back(scale); } _array = new T[size]; _array_size = size; } ~Matrix() { delete[] _array; } T &cell(...) { va_list args; va_start(args, this); size_t offset = 0; std::vector::const_iterator i; for (i = _scale.begin(); i != _scale.end(); ++i) { size_t idx = va_arg(args, size_t); offset += idx*(*i); } va_end(args); assert(offset < _array_size); return *(_array + offset); } }; }; #endif // CXX_DPROG_HH