mirror of
https://github.com/BlackMATov/vmath.hpp.git
synced 2025-12-15 12:39:47 +07:00
vector and matrix iterators
This commit is contained in:
@@ -9,6 +9,8 @@
|
||||
#include <cmath>
|
||||
#include <cstddef>
|
||||
|
||||
#include <initializer_list>
|
||||
#include <iterator>
|
||||
#include <stdexcept>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
@@ -192,6 +192,11 @@ namespace vmath_hpp
|
||||
using reference = row_type&;
|
||||
using const_reference = const row_type&;
|
||||
|
||||
using iterator = pointer;
|
||||
using const_iterator = const_pointer;
|
||||
using reverse_iterator = std::reverse_iterator<iterator>;
|
||||
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
|
||||
|
||||
static constexpr std::size_t size = Size;
|
||||
public:
|
||||
using base_type::mat_base;
|
||||
@@ -208,11 +213,26 @@ namespace vmath_hpp
|
||||
}
|
||||
}
|
||||
|
||||
[[nodiscard]] constexpr pointer data() noexcept {
|
||||
[[nodiscard]] iterator begin() noexcept { return iterator(data()); }
|
||||
[[nodiscard]] const_iterator begin() const noexcept { return const_iterator(data()); }
|
||||
[[nodiscard]] iterator end() noexcept { return iterator(data() + Size); }
|
||||
[[nodiscard]] const_iterator end() const noexcept { return const_iterator(data() + Size); }
|
||||
|
||||
[[nodiscard]] reverse_iterator rbegin() noexcept { return reverse_iterator(end()); }
|
||||
[[nodiscard]] const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
|
||||
[[nodiscard]] reverse_iterator rend() noexcept { return reverse_iterator(begin()); }
|
||||
[[nodiscard]] const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
|
||||
|
||||
[[nodiscard]] const_iterator cbegin() const noexcept { return begin(); }
|
||||
[[nodiscard]] const_iterator cend() const noexcept { return end(); }
|
||||
[[nodiscard]] const_reverse_iterator crbegin() const noexcept { return rbegin(); }
|
||||
[[nodiscard]] const_reverse_iterator crend() const noexcept { return rend(); }
|
||||
|
||||
[[nodiscard]] pointer data() noexcept {
|
||||
return &rows[0];
|
||||
}
|
||||
|
||||
[[nodiscard]] constexpr const_pointer data() const noexcept {
|
||||
[[nodiscard]] const_pointer data() const noexcept {
|
||||
return &rows[0];
|
||||
}
|
||||
|
||||
|
||||
@@ -159,6 +159,11 @@ namespace vmath_hpp
|
||||
using reference = component_type&;
|
||||
using const_reference = const component_type&;
|
||||
|
||||
using iterator = pointer;
|
||||
using const_iterator = const_pointer;
|
||||
using reverse_iterator = std::reverse_iterator<iterator>;
|
||||
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
|
||||
|
||||
static constexpr std::size_t size = Size;
|
||||
public:
|
||||
using base_type::vec_base;
|
||||
@@ -175,11 +180,26 @@ namespace vmath_hpp
|
||||
}
|
||||
}
|
||||
|
||||
[[nodiscard]] constexpr pointer data() noexcept {
|
||||
[[nodiscard]] iterator begin() noexcept { return iterator(data()); }
|
||||
[[nodiscard]] const_iterator begin() const noexcept { return const_iterator(data()); }
|
||||
[[nodiscard]] iterator end() noexcept { return iterator(data() + Size); }
|
||||
[[nodiscard]] const_iterator end() const noexcept { return const_iterator(data() + Size); }
|
||||
|
||||
[[nodiscard]] reverse_iterator rbegin() noexcept { return reverse_iterator(end()); }
|
||||
[[nodiscard]] const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
|
||||
[[nodiscard]] reverse_iterator rend() noexcept { return reverse_iterator(begin()); }
|
||||
[[nodiscard]] const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
|
||||
|
||||
[[nodiscard]] const_iterator cbegin() const noexcept { return begin(); }
|
||||
[[nodiscard]] const_iterator cend() const noexcept { return end(); }
|
||||
[[nodiscard]] const_reverse_iterator crbegin() const noexcept { return rbegin(); }
|
||||
[[nodiscard]] const_reverse_iterator crend() const noexcept { return rend(); }
|
||||
|
||||
[[nodiscard]] pointer data() noexcept {
|
||||
return &(*this)[0];
|
||||
}
|
||||
|
||||
[[nodiscard]] constexpr const_pointer data() const noexcept {
|
||||
[[nodiscard]] const_pointer data() const noexcept {
|
||||
return &(*this)[0];
|
||||
}
|
||||
|
||||
|
||||
@@ -121,26 +121,96 @@ TEST_CASE("vmath/mat") {
|
||||
}
|
||||
}
|
||||
|
||||
SUBCASE("iter") {
|
||||
{
|
||||
int2x2 m{1,2,3,4};
|
||||
|
||||
REQUIRE(*m.begin() == vec{1,2});
|
||||
REQUIRE(*(m.begin() + 1) == vec{3,4});
|
||||
REQUIRE(*(m.end() - 1) == vec{3,4});
|
||||
REQUIRE(*(m.end() - 2) == vec{1,2});
|
||||
REQUIRE(m.begin() + 2 == m.end());
|
||||
REQUIRE(m.end() - 2 == m.begin());
|
||||
|
||||
REQUIRE(*m.cbegin() == vec{1,2});
|
||||
REQUIRE(*(m.cbegin() + 1) == vec{3,4});
|
||||
REQUIRE(*(m.cend() - 1) == vec{3,4});
|
||||
REQUIRE(*(m.cend() - 2) == vec{1,2});
|
||||
REQUIRE(m.cbegin() + 2 == m.cend());
|
||||
REQUIRE(m.cend() - 2 == m.cbegin());
|
||||
|
||||
REQUIRE(*m.rbegin() == vec{3,4});
|
||||
REQUIRE(*(m.rbegin() + 1) == vec{1,2});
|
||||
REQUIRE(*(m.rend() - 1) == vec{1,2});
|
||||
REQUIRE(*(m.rend() - 2) == vec{3,4});
|
||||
REQUIRE(m.rbegin() + 2 == m.rend());
|
||||
REQUIRE(m.rend() - 2 == m.rbegin());
|
||||
|
||||
REQUIRE(*m.crbegin() == vec{3,4});
|
||||
REQUIRE(*(m.crbegin() + 1) == vec{1,2});
|
||||
REQUIRE(*(m.crend() - 1) == vec{1,2});
|
||||
REQUIRE(*(m.crend() - 2) == vec{3,4});
|
||||
REQUIRE(m.crbegin() + 2 == m.crend());
|
||||
REQUIRE(m.crend() - 2 == m.crbegin());
|
||||
|
||||
*m.begin() = {5,6};
|
||||
REQUIRE(m == int2x2{5,6,3,4});
|
||||
*m.rbegin() = {7,8};
|
||||
REQUIRE(m == int2x2{5,6,7,8});
|
||||
}
|
||||
{
|
||||
const int2x2 m{1,2,3,4};
|
||||
|
||||
REQUIRE(*m.begin() == vec{1,2});
|
||||
REQUIRE(*(m.begin() + 1) == vec{3,4});
|
||||
REQUIRE(*(m.end() - 1) == vec{3,4});
|
||||
REQUIRE(*(m.end() - 2) == vec{1,2});
|
||||
REQUIRE(m.begin() + 2 == m.end());
|
||||
REQUIRE(m.end() - 2 == m.begin());
|
||||
|
||||
REQUIRE(*m.cbegin() == vec{1,2});
|
||||
REQUIRE(*(m.cbegin() + 1) == vec{3,4});
|
||||
REQUIRE(*(m.cend() - 1) == vec{3,4});
|
||||
REQUIRE(*(m.cend() - 2) == vec{1,2});
|
||||
REQUIRE(m.cbegin() + 2 == m.cend());
|
||||
REQUIRE(m.cend() - 2 == m.cbegin());
|
||||
|
||||
REQUIRE(*m.rbegin() == vec{3,4});
|
||||
REQUIRE(*(m.rbegin() + 1) == vec{1,2});
|
||||
REQUIRE(*(m.rend() - 1) == vec{1,2});
|
||||
REQUIRE(*(m.rend() - 2) == vec{3,4});
|
||||
REQUIRE(m.rbegin() + 2 == m.rend());
|
||||
REQUIRE(m.rend() - 2 == m.rbegin());
|
||||
|
||||
REQUIRE(*m.crbegin() == vec{3,4});
|
||||
REQUIRE(*(m.crbegin() + 1) == vec{1,2});
|
||||
REQUIRE(*(m.crend() - 1) == vec{1,2});
|
||||
REQUIRE(*(m.crend() - 2) == vec{3,4});
|
||||
REQUIRE(m.crbegin() + 2 == m.crend());
|
||||
REQUIRE(m.crend() - 2 == m.crbegin());
|
||||
}
|
||||
}
|
||||
|
||||
SUBCASE("data") {
|
||||
{
|
||||
int2x2 m2;
|
||||
STATIC_REQUIRE(m2.data() == &m2[0]);
|
||||
REQUIRE(m2.data() == &m2[0]);
|
||||
|
||||
int3x3 m3;
|
||||
STATIC_REQUIRE(m3.data() == &m3[0]);
|
||||
REQUIRE(m3.data() == &m3[0]);
|
||||
|
||||
int4x4 m4;
|
||||
STATIC_REQUIRE(m4.data() == &m4[0]);
|
||||
REQUIRE(m4.data() == &m4[0]);
|
||||
}
|
||||
{
|
||||
constexpr int2x2 m2;
|
||||
STATIC_REQUIRE(m2.data() == &m2[0]);
|
||||
const int2x2 m2;
|
||||
REQUIRE(m2.data() == &m2[0]);
|
||||
|
||||
constexpr int3x3 m3;
|
||||
STATIC_REQUIRE(m3.data() == &m3[0]);
|
||||
const int3x3 m3;
|
||||
REQUIRE(m3.data() == &m3[0]);
|
||||
|
||||
constexpr int4x4 m4;
|
||||
STATIC_REQUIRE(m4.data() == &m4[0]);
|
||||
const int4x4 m4;
|
||||
REQUIRE(m4.data() == &m4[0]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -118,6 +118,76 @@ TEST_CASE("vmath/vec") {
|
||||
}
|
||||
}
|
||||
|
||||
SUBCASE("iter") {
|
||||
{
|
||||
int2 v{1,2};
|
||||
|
||||
REQUIRE(*v.begin() == 1);
|
||||
REQUIRE(*(v.begin() + 1) == 2);
|
||||
REQUIRE(*(v.end() - 1) == 2);
|
||||
REQUIRE(*(v.end() - 2) == 1);
|
||||
REQUIRE(v.begin() + 2 == v.end());
|
||||
REQUIRE(v.end() - 2 == v.begin());
|
||||
|
||||
REQUIRE(*v.cbegin() == 1);
|
||||
REQUIRE(*(v.cbegin() + 1) == 2);
|
||||
REQUIRE(*(v.cend() - 1) == 2);
|
||||
REQUIRE(*(v.cend() - 2) == 1);
|
||||
REQUIRE(v.cbegin() + 2 == v.cend());
|
||||
REQUIRE(v.cend() - 2 == v.cbegin());
|
||||
|
||||
REQUIRE(*v.rbegin() == 2);
|
||||
REQUIRE(*(v.rbegin() + 1) == 1);
|
||||
REQUIRE(*(v.rend() - 1) == 1);
|
||||
REQUIRE(*(v.rend() - 2) == 2);
|
||||
REQUIRE(v.rbegin() + 2 == v.rend());
|
||||
REQUIRE(v.rend() - 2 == v.rbegin());
|
||||
|
||||
REQUIRE(*v.crbegin() == 2);
|
||||
REQUIRE(*(v.crbegin() + 1) == 1);
|
||||
REQUIRE(*(v.crend() - 1) == 1);
|
||||
REQUIRE(*(v.crend() - 2) == 2);
|
||||
REQUIRE(v.crbegin() + 2 == v.crend());
|
||||
REQUIRE(v.crend() - 2 == v.crbegin());
|
||||
|
||||
*v.begin() = 3;
|
||||
REQUIRE(v == int2{3,2});
|
||||
*v.rbegin() = 4;
|
||||
REQUIRE(v == int2{3,4});
|
||||
}
|
||||
{
|
||||
const int2 v{1,2};
|
||||
|
||||
REQUIRE(*v.begin() == 1);
|
||||
REQUIRE(*(v.begin() + 1) == 2);
|
||||
REQUIRE(*(v.end() - 1) == 2);
|
||||
REQUIRE(*(v.end() - 2) == 1);
|
||||
REQUIRE(v.begin() + 2 == v.end());
|
||||
REQUIRE(v.end() - 2 == v.begin());
|
||||
|
||||
REQUIRE(*v.cbegin() == 1);
|
||||
REQUIRE(*(v.cbegin() + 1) == 2);
|
||||
REQUIRE(*(v.cend() - 1) == 2);
|
||||
REQUIRE(*(v.cend() - 2) == 1);
|
||||
REQUIRE(v.cbegin() + 2 == v.cend());
|
||||
REQUIRE(v.cend() - 2 == v.cbegin());
|
||||
|
||||
REQUIRE(*v.rbegin() == 2);
|
||||
REQUIRE(*(v.rbegin() + 1) == 1);
|
||||
REQUIRE(*(v.rend() - 1) == 1);
|
||||
REQUIRE(*(v.rend() - 2) == 2);
|
||||
REQUIRE(v.rbegin() + 2 == v.rend());
|
||||
REQUIRE(v.rend() - 2 == v.rbegin());
|
||||
|
||||
REQUIRE(*v.crbegin() == 2);
|
||||
REQUIRE(*(v.crbegin() + 1) == 1);
|
||||
REQUIRE(*(v.crend() - 1) == 1);
|
||||
REQUIRE(*(v.crend() - 2) == 2);
|
||||
REQUIRE(v.crbegin() + 2 == v.crend());
|
||||
REQUIRE(v.crend() - 2 == v.crbegin());
|
||||
}
|
||||
}
|
||||
|
||||
SUBCASE("data") {
|
||||
{
|
||||
int2 i2;
|
||||
@@ -130,14 +200,14 @@ TEST_CASE("vmath/vec") {
|
||||
REQUIRE(i4.data() == &i4[0]);
|
||||
}
|
||||
{
|
||||
constexpr int2 i2;
|
||||
STATIC_REQUIRE(i2.data() == &i2[0]);
|
||||
const int2 i2;
|
||||
REQUIRE(i2.data() == &i2[0]);
|
||||
|
||||
constexpr int3 i3;
|
||||
STATIC_REQUIRE(i3.data() == &i3[0]);
|
||||
const int3 i3;
|
||||
REQUIRE(i3.data() == &i3[0]);
|
||||
|
||||
constexpr int4 i4;
|
||||
STATIC_REQUIRE(i4.data() == &i4[0]);
|
||||
const int4 i4;
|
||||
REQUIRE(i4.data() == &i4[0]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user