#pragma once #include "interfaces/matrix.hpp" #include "engine/data/bounds.hpp" #include "engine/data/vector2.hpp" #include "engine/graphics/matrix_iterator.hpp" #include #include template class Matrix : public IMatrix { public: explicit Matrix(const Bounds &bounds) noexcept; Matrix(const Matrix &matrix) noexcept; Matrix(Matrix &&matrix) noexcept; ~Matrix() noexcept override; void fill(Element element) noexcept override; [[nodiscard]] auto get(const Vector2 &pos) const noexcept -> Element override; void set(const Vector2 &pos, Element element) noexcept override; [[nodiscard]] auto get_row_cnt() const noexcept -> std::uint32_t override; [[nodiscard]] auto get_column_cnt() const noexcept -> std::uint32_t override; [[nodiscard]] auto begin() const noexcept -> MatrixIterator override; [[nodiscard]] auto end() const noexcept -> MatrixIterator override; auto operator=(const Matrix &rhs) noexcept -> Matrix &; auto operator=(Matrix &&rhs) noexcept -> Matrix &; private: gsl::owner _matrix; std::uint32_t _row_cnt; std::uint32_t _column_cnt; void _delete_matrix() noexcept; void _copy_matrix_from(const Matrix &source) noexcept; }; #include "matrix_impl.hpp"