row_reference.hpp 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. #pragma once
  2. #include <cstdlib>
  3. #include <stdexcept>
  4. #include "expect/expect.hpp"
  5. #include "math/vector/vector.hpp"
  6. namespace math { namespace matrix {
  7. template <typename T, size_t C> class row_reference {
  8. private:
  9. row_reference(T (&h)[C]) : _handle(h) {}
  10. public:
  11. row_reference(row_reference const &) = delete;
  12. row_reference(row_reference &&) = default;
  13. template <typename S>
  14. row_reference & operator=(row_reference<S, C> const & other) {
  15. VECTOR_FOR_EACH_RANGE(i, C) { _handle[i] = other[i]; }
  16. return *this;
  17. }
  18. T const & operator[](size_t col) const { return _handle[col]; }
  19. T & operator[](size_t col) { return _handle[col]; }
  20. T const & at(size_t col) const {
  21. expects(col < C, std::out_of_range, "column index out of range");
  22. return operator[](col);
  23. }
  24. T & at(size_t col) {
  25. expects(col < C, std::out_of_range, "column index out of range");
  26. return operator[](col);
  27. }
  28. private:
  29. template <typename _T, size_t R, size_t _C> friend class matrix;
  30. T (&_handle)[C];
  31. };
  32. }}