Advertisement
Metalhead33

TriangularMatrix.h

Jun 2nd, 2017
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.60 KB | None | 0 0
  1. #ifndef TRIANGULARMATRIX_HPP
  2. #define TRIANGULARMATRIX_HPP
  3. #include <vector>
  4. #include <cstdlib>
  5.  
  6. template <typename T> class TriangularMatrix
  7. {
  8. private:
  9.     std::vector<T> stuff;
  10.     size_t width;
  11. public:
  12.     struct Position {
  13.         size_t x;
  14.         size_t y;
  15.         Position(size_t nx, size_t ny) {
  16.         x = ny;
  17.         y = ny;
  18.         }
  19.     };
  20.     size_t getWidth() const { return width; }
  21.     size_t absolutePosition(Position& pos);
  22.     size_t absolutePosition(size_t x, size_t y);
  23.     TriangularMatrix(size_t x);
  24.     T& at(size_t x, size_t y);
  25.     T& operator()(size_t x, size_t y);
  26.     void resize(size_t newwidth);
  27.     std::vector<T>& getRawVector();
  28. };
  29.  
  30. template <typename T> TriangularMatrix<T>::TriangularMatrix(size_t x)
  31.     : stuff( (x + 1)*x/2  )
  32. {
  33.     width = x;
  34. }
  35. #define TRIANGLE_MATRIX_FUNC(ret,name) template <typename T> ret TriangularMatrix<T>::name
  36.  
  37. TRIANGLE_MATRIX_FUNC(std::vector<T>&,getRawVector)()
  38. {
  39.     return stuff;
  40. }
  41. TRIANGLE_MATRIX_FUNC(size_t,absolutePosition)(Position& pos)
  42. {
  43.     //return pos.x*(pos.x+1)/2+pos.y;
  44.     if(pos.y >= pos.x) return pos.x + (pos.y+1)*pos.y/2;
  45.     else return pos.y + (pos.x+1)*pos.x/2;
  46. }
  47. TRIANGLE_MATRIX_FUNC(size_t,absolutePosition)(size_t x, size_t y)
  48. {
  49.     if(y >= x) return x + (y+1)*y/2;
  50.     else return y + (x+1)*x/2;
  51. }
  52. TRIANGLE_MATRIX_FUNC(T&,at)(size_t x, size_t y)
  53. {
  54.     return stuff[absolutePosition(x,y) ];
  55. }
  56. TRIANGLE_MATRIX_FUNC(T&,operator())(size_t x, size_t y)
  57. {
  58.     return stuff[absolutePosition(x,y) ];
  59. }
  60. void resize(size_t newwidth);
  61. TRIANGLE_MATRIX_FUNC(void,resize)(size_t newwidth)
  62. {
  63.     stuff.resize( (newwidth + 1)*newwidth/2 );
  64. }
  65.  
  66. #undef TRIANGLE_MATRIX_FUNC
  67. #endif // TRIANGULARMATRIX_HPP
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement