aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bootstrap.cpp4
-rw-r--r--src/engine/graphics/matrix.hpp53
-rw-r--r--src/engine/graphics/matrix.tpp156
-rw-r--r--src/engine/graphics/string_matrix.cpp140
-rw-r--r--src/engine/graphics/string_matrix.hpp52
-rw-r--r--src/interfaces/matrix.hpp4
6 files changed, 213 insertions, 196 deletions
diff --git a/src/bootstrap.cpp b/src/bootstrap.cpp
index 8dec609..e8315bd 100644
--- a/src/bootstrap.cpp
+++ b/src/bootstrap.cpp
@@ -19,8 +19,8 @@
#include "engine/data/bounds.hpp"
#include "engine/data/vector2.hpp"
#include "engine/engine.hpp"
+#include "engine/graphics/matrix.hpp"
#include "engine/graphics/scene.hpp"
-#include "engine/graphics/string_matrix.hpp"
#include "engine/graphics/window.hpp"
#include "engine/user/cursor.hpp"
#include "engine/user/input.hpp"
@@ -83,7 +83,7 @@ Container bootstrap() noexcept
[](const Bounds &bounds)
{
return std::dynamic_pointer_cast<IMatrix<std::string_view>>(
- std::make_shared<StringMatrix>(bounds));
+ std::make_shared<Matrix<std::string_view>>(bounds));
});
container.bind<ISceneFactory>().to_factory(normalize_lambda(
diff --git a/src/engine/graphics/matrix.hpp b/src/engine/graphics/matrix.hpp
new file mode 100644
index 0000000..2c9ba81
--- /dev/null
+++ b/src/engine/graphics/matrix.hpp
@@ -0,0 +1,53 @@
+#pragma once
+
+#include "interfaces/matrix.hpp"
+
+#include "engine/data/bounds.hpp"
+#include "engine/data/vector2.hpp"
+#include "engine/matrix_iterator.hpp"
+
+#include <gsl/pointers>
+#include <memory>
+
+template <typename Element>
+class Matrix : public IMatrix<Element>
+{
+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]] Element get(const Vector2 &pos) const noexcept override;
+
+ void set(const Vector2 &pos, Element element) noexcept override;
+
+ [[nodiscard]] uint32_t get_row_cnt() const noexcept override;
+
+ [[nodiscard]] uint32_t get_column_cnt() const noexcept override;
+
+ [[nodiscard]] MatrixIterator<Element> begin() const noexcept override;
+
+ [[nodiscard]] MatrixIterator<Element> end() const noexcept override;
+
+ Matrix &operator=(const Matrix &rhs) noexcept;
+
+ Matrix &operator=(Matrix &&rhs) noexcept;
+
+private:
+ gsl::owner<Element **> _matrix;
+
+ uint32_t _row_cnt;
+ uint32_t _column_cnt;
+
+ void _delete_matrix() noexcept;
+
+ void _copy_matrix_from(const Matrix &source) noexcept;
+};
+
+#include "matrix.tpp"
diff --git a/src/engine/graphics/matrix.tpp b/src/engine/graphics/matrix.tpp
new file mode 100644
index 0000000..e0e65bb
--- /dev/null
+++ b/src/engine/graphics/matrix.tpp
@@ -0,0 +1,156 @@
+#pragma once
+
+#include "matrix.hpp"
+
+template <typename Element>
+Matrix<Element>::Matrix(const Bounds &bounds) noexcept
+ : _matrix(new Element *[bounds.get_height()]),
+ _row_cnt(bounds.get_height()),
+ _column_cnt(bounds.get_width())
+{
+ for (gsl::owner<Element **> row = _matrix; row != _matrix + _row_cnt; row++)
+ {
+ *row = static_cast<gsl::owner<Element *>>(new Element[bounds.get_width()]);
+ }
+};
+
+template <typename Element>
+Matrix<Element>::Matrix(const Matrix &matrix) noexcept
+ : _matrix(new Element *[matrix._row_cnt]),
+ _row_cnt(matrix._row_cnt),
+ _column_cnt(matrix._column_cnt)
+{
+ _copy_matrix_from(matrix);
+}
+
+template <typename Element>
+Matrix<Element>::Matrix(Matrix &&matrix) noexcept
+ : _matrix(matrix._matrix), _row_cnt(matrix._row_cnt), _column_cnt(matrix._column_cnt)
+{
+ matrix._matrix = nullptr;
+}
+
+template <typename Element>
+Matrix<Element>::~Matrix() noexcept
+{
+ _delete_matrix();
+}
+
+template <typename Element>
+void Matrix<Element>::fill(Element element) noexcept
+{
+ for (auto row : *this)
+ {
+ for (auto &col : row)
+ {
+ col = element;
+ }
+ }
+}
+
+template <typename Element>
+Element Matrix<Element>::get(const Vector2 &pos) const noexcept
+{
+
+ auto x = static_cast<std::size_t>(pos.get_x());
+ auto y = static_cast<std::size_t>(pos.get_y());
+
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic)
+ return _matrix[y][x];
+}
+
+template <typename Element>
+void Matrix<Element>::set(const Vector2 &pos, Element element) noexcept
+{
+ auto x = static_cast<std::size_t>(pos.get_x());
+ auto y = static_cast<std::size_t>(pos.get_y());
+
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic)
+ _matrix[y][x] = element;
+}
+
+template <typename Element>
+uint32_t Matrix<Element>::get_row_cnt() const noexcept
+{
+ return _row_cnt;
+}
+
+template <typename Element>
+uint32_t Matrix<Element>::get_column_cnt() const noexcept
+{
+ return _column_cnt;
+}
+
+template <typename Element>
+MatrixIterator<Element> Matrix<Element>::begin() const noexcept
+{
+ return MatrixIterator(_matrix, _column_cnt);
+}
+
+template <typename Element>
+MatrixIterator<Element> Matrix<Element>::end() const noexcept
+{
+ return MatrixIterator(_matrix + _row_cnt, _column_cnt);
+}
+
+template <typename Element>
+Matrix<Element> &Matrix<Element>::operator=(const Matrix &rhs) noexcept
+{
+ if (&rhs != this)
+ {
+ _delete_matrix();
+
+ // NOLINTNEXTLINE(cppcoreguidelines-owning-memory)
+ _matrix = nullptr;
+
+ _matrix = new Element *[rhs._row_cnt];
+ _copy_matrix_from(rhs);
+ }
+
+ return *this;
+}
+
+template <typename Element>
+Matrix<Element> &Matrix<Element>::operator=(Matrix &&rhs) noexcept
+{
+ if (&rhs != this)
+ {
+ _delete_matrix();
+
+ // NOLINTNEXTLINE(cppcoreguidelines-owning-memory)
+ _matrix = rhs._matrix;
+
+ rhs._matrix = nullptr;
+ }
+
+ return *this;
+}
+
+template <typename Element>
+void Matrix<Element>::_delete_matrix() noexcept
+{
+ for (gsl::owner<Element **> row = _matrix; row != _matrix + _row_cnt; row++)
+ {
+ delete[](*row);
+ }
+
+ delete[] _matrix;
+}
+
+template <typename Element>
+void Matrix<Element>::_copy_matrix_from(const Matrix &source) noexcept
+{
+ // NOLINTNEXTLINE(cppcoreguidelines-owning-memory)
+ gsl::owner<Element **> source_row = source._matrix;
+
+ for (gsl::owner<Element **> row = _matrix; row != _matrix + _row_cnt;
+ row++, source_row++)
+ {
+ *row = static_cast<gsl::owner<Element *>>(new Element[_column_cnt]);
+
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic)
+ auto *end = *source_row + _column_cnt;
+
+ std::copy(*source_row, end, *row);
+ }
+}
diff --git a/src/engine/graphics/string_matrix.cpp b/src/engine/graphics/string_matrix.cpp
deleted file mode 100644
index 3920b8e..0000000
--- a/src/engine/graphics/string_matrix.cpp
+++ /dev/null
@@ -1,140 +0,0 @@
-#include "string_matrix.hpp"
-
-#include <iostream>
-#include <ranges>
-
-StringMatrix::StringMatrix(const Bounds &bounds) noexcept
- : _matrix(new std::string_view *[bounds.get_height()]),
- _row_cnt(bounds.get_height()),
- _column_cnt(bounds.get_width())
-{
- for (gsl::owner<std::string_view **> row = _matrix; row != _matrix + _row_cnt; row++)
- {
- *row = static_cast<gsl::owner<std::string_view *>>(
- new std::string_view[bounds.get_width()]);
- }
-};
-
-StringMatrix::StringMatrix(const StringMatrix &string_matrix) noexcept
- : _matrix(new std::string_view *[string_matrix._row_cnt]),
- _row_cnt(string_matrix._row_cnt),
- _column_cnt(string_matrix._column_cnt)
-{
- _copy_matrix_from(string_matrix);
-}
-
-StringMatrix::StringMatrix(StringMatrix &&string_matrix) noexcept
- : _matrix(string_matrix._matrix),
- _row_cnt(string_matrix._row_cnt),
- _column_cnt(string_matrix._column_cnt)
-{
- string_matrix._matrix = nullptr;
-}
-
-StringMatrix::~StringMatrix() noexcept
-{
- _delete_matrix();
-}
-
-void StringMatrix::fill(std::string_view element) noexcept
-{
- for (auto row : *this)
- {
- for (auto &col : row)
- {
- col = element;
- }
- }
-}
-
-std::string_view StringMatrix::get(const Vector2 &pos) const noexcept
-{
-
- auto x = static_cast<std::size_t>(pos.get_x());
- auto y = static_cast<std::size_t>(pos.get_y());
-
- // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic)
- return _matrix[y][x];
-}
-
-void StringMatrix::set(const Vector2 &pos, std::string_view element) noexcept
-{
- auto x = static_cast<std::size_t>(pos.get_x());
- auto y = static_cast<std::size_t>(pos.get_y());
-
- // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic)
- _matrix[y][x] = element;
-}
-
-uint32_t StringMatrix::get_row_cnt() const noexcept
-{
- return _row_cnt;
-}
-
-uint32_t StringMatrix::get_column_cnt() const noexcept
-{
- return _column_cnt;
-}
-
-MatrixIterator<std::string_view> StringMatrix::begin() const noexcept
-{
- return MatrixIterator(_matrix, _column_cnt);
-}
-
-MatrixIterator<std::string_view> StringMatrix::end() const noexcept
-{
- return MatrixIterator(_matrix + _row_cnt, _column_cnt);
-}
-
-StringMatrix &StringMatrix::operator=(const StringMatrix &rhs) noexcept
-{
- if (&rhs != this)
- {
- _delete_matrix();
- _matrix = nullptr;
-
- _matrix = new std::string_view *[rhs._row_cnt];
- _copy_matrix_from(rhs);
- }
-
- return *this;
-}
-
-StringMatrix &StringMatrix::operator=(StringMatrix &&rhs) noexcept
-{
- if (&rhs != this)
- {
- _delete_matrix();
- _matrix = rhs._matrix;
- rhs._matrix = nullptr;
- }
-
- return *this;
-}
-
-void StringMatrix::_delete_matrix() noexcept
-{
- for (gsl::owner<std::string_view **> row = _matrix; row != _matrix + _row_cnt; row++)
- {
- delete[](*row);
- }
-
- delete[] _matrix;
-}
-
-void StringMatrix::_copy_matrix_from(const StringMatrix &source) noexcept
-{
- gsl::owner<std::string_view **> source_row = source._matrix;
-
- for (gsl::owner<std::string_view **> row = _matrix; row != _matrix + _row_cnt;
- row++, source_row++)
- {
- *row = static_cast<gsl::owner<std::string_view *>>(
- new std::string_view[_column_cnt]);
-
- // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic)
- auto *end = *source_row + _column_cnt;
-
- std::copy(*source_row, end, *row);
- }
-}
diff --git a/src/engine/graphics/string_matrix.hpp b/src/engine/graphics/string_matrix.hpp
deleted file mode 100644
index ff0939c..0000000
--- a/src/engine/graphics/string_matrix.hpp
+++ /dev/null
@@ -1,52 +0,0 @@
-#pragma once
-
-#include "interfaces/matrix.hpp"
-
-#include "engine/data/bounds.hpp"
-#include "engine/data/vector2.hpp"
-#include "engine/matrix_iterator.hpp"
-
-#include <gsl/pointers>
-#include <memory>
-#include <string_view>
-#include <vector>
-
-class StringMatrix : public IMatrix<std::string_view>
-{
-public:
- explicit StringMatrix(const Bounds &bounds) noexcept;
-
- StringMatrix(const StringMatrix &string_matrix) noexcept;
-
- StringMatrix(StringMatrix &&string_matrix) noexcept;
-
- ~StringMatrix() noexcept override;
-
- void fill(std::string_view element) noexcept override;
-
- [[nodiscard]] std::string_view get(const Vector2 &pos) const noexcept override;
-
- void set(const Vector2 &pos, std::string_view element) noexcept override;
-
- [[nodiscard]] uint32_t get_row_cnt() const noexcept override;
-
- [[nodiscard]] uint32_t get_column_cnt() const noexcept override;
-
- [[nodiscard]] MatrixIterator<std::string_view> begin() const noexcept override;
-
- [[nodiscard]] MatrixIterator<std::string_view> end() const noexcept override;
-
- StringMatrix &operator=(const StringMatrix &rhs) noexcept;
-
- StringMatrix &operator=(StringMatrix &&rhs) noexcept;
-
-private:
- gsl::owner<std::string_view **> _matrix;
-
- uint32_t _row_cnt;
- uint32_t _column_cnt;
-
- void _delete_matrix() noexcept;
-
- void _copy_matrix_from(const StringMatrix &source) noexcept;
-};
diff --git a/src/interfaces/matrix.hpp b/src/interfaces/matrix.hpp
index c22c0a7..2b33342 100644
--- a/src/interfaces/matrix.hpp
+++ b/src/interfaces/matrix.hpp
@@ -29,9 +29,9 @@ public:
[[nodiscard]] virtual uint32_t get_column_cnt() const noexcept = 0;
- [[nodiscard]] virtual MatrixIterator<std::string_view> begin() const noexcept = 0;
+ [[nodiscard]] virtual MatrixIterator<Element> begin() const noexcept = 0;
- [[nodiscard]] virtual MatrixIterator<std::string_view> end() const noexcept = 0;
+ [[nodiscard]] virtual MatrixIterator<Element> end() const noexcept = 0;
IMatrix &operator=(const IMatrix &matrix) noexcept = default;