diff --git a/README.md b/README.md index ae9f889..0663c02 100644 --- a/README.md +++ b/README.md @@ -508,6 +508,26 @@ auto operator~(const vec& xs); template < typename T, size_t Size > auto operator!(const vec& xs); +// ++operator + +template < typename T, size_t Size > +vec& operator++(vec& xs); + +// --operator + +template < typename T, size_t Size > +vec& operator--(vec& xs); + +// operator++ + +template < typename T, size_t Size > +vec operator++(vec& xs, int); + +// operator-- + +template < typename T, size_t Size > +vec operator--(vec& xs, int); + // operator+ template < typename T, typename U, size_t Size > @@ -702,6 +722,26 @@ auto operator~(const mat& xs); template < typename T, size_t Size > auto operator!(const mat& xs); +// ++operator + +template < typename T, size_t Size > +mat& operator++(mat& xs); + +// --operator + +template < typename T, size_t Size > +mat& operator--(mat& xs); + +// operator++ + +template < typename T, size_t Size > +mat operator++(mat& xs, int); + +// operator-- + +template < typename T, size_t Size > +mat operator--(mat& xs, int); + // operator+ template < typename T, typename U, size_t Size > diff --git a/headers/vmath.hpp/vmath_mat_fun.hpp b/headers/vmath.hpp/vmath_mat_fun.hpp index b3a4835..025d8ca 100644 --- a/headers/vmath.hpp/vmath_mat_fun.hpp +++ b/headers/vmath.hpp/vmath_mat_fun.hpp @@ -187,6 +187,38 @@ namespace vmath_hpp return map_join([](const vec& x){ return !x; }, xs); } + // ++operator + + template < typename T, std::size_t Size > + constexpr mat& operator++(mat& xs) { + return (xs = xs + T{1}); + } + + // --operator + + template < typename T, std::size_t Size > + constexpr mat& operator--(mat& xs) { + return (xs = xs - T{1}); + } + + // operator++ + + template < typename T, std::size_t Size > + constexpr mat operator++(mat& xs, int) { + mat ys = xs; + ++xs; + return ys; + } + + // operator-- + + template < typename T, std::size_t Size > + constexpr mat operator--(mat& xs, int) { + mat ys = xs; + --xs; + return ys; + } + // operator+ template < typename T, typename U, std::size_t Size > diff --git a/headers/vmath.hpp/vmath_vec_fun.hpp b/headers/vmath.hpp/vmath_vec_fun.hpp index 115adec..bed40cc 100644 --- a/headers/vmath.hpp/vmath_vec_fun.hpp +++ b/headers/vmath.hpp/vmath_vec_fun.hpp @@ -238,6 +238,38 @@ namespace vmath_hpp return map_join([](T x){ return !x; }, xs); } + // ++operator + + template < typename T, std::size_t Size > + constexpr vec& operator++(vec& xs) { + return (xs = xs + T{1}); + } + + // --operator + + template < typename T, std::size_t Size > + constexpr vec& operator--(vec& xs) { + return (xs = xs - T{1}); + } + + // operator++ + + template < typename T, std::size_t Size > + constexpr vec operator++(vec& xs, int) { + vec ys = xs; + ++xs; + return ys; + } + + // operator-- + + template < typename T, std::size_t Size > + constexpr vec operator--(vec& xs, int) { + vec ys = xs; + --xs; + return ys; + } + // operator+ template < typename T, typename U, std::size_t Size > diff --git a/untests/vmath_mat_fun_tests.cpp b/untests/vmath_mat_fun_tests.cpp index e41cd71..01378ce 100644 --- a/untests/vmath_mat_fun_tests.cpp +++ b/untests/vmath_mat_fun_tests.cpp @@ -72,6 +72,20 @@ TEST_CASE("vmath/mat_fun") { STATIC_CHECK((int2x2(0,1,0,1) && int2x2(1,0,1,0)) == bool2x2(0,0,0,0)); STATIC_CHECK((int2x2(0,1,0,1) || int2x2(1,0,1,0)) == bool2x2(1,1,1,1)); + { + int2x2 v{1,2,3,4}; + CHECK(&v == &(++v)); + CHECK(v == int2x2{2,3,4,5}); + CHECK(&v == &(--v)); + CHECK(v == int2x2{1,2,3,4}); + } + { + int2x2 v{1,2,3,4}; + CHECK(v++ == int2x2{1,2,3,4}); + CHECK(v == int2x2{2,3,4,5}); + CHECK(v-- == int2x2{2,3,4,5}); + CHECK(v == int2x2{1,2,3,4}); + } { int2x2 v{1,2,3,4}; CHECK(&v == &(v += 3)); diff --git a/untests/vmath_vec_fun_tests.cpp b/untests/vmath_vec_fun_tests.cpp index 9ddad99..6590b6e 100644 --- a/untests/vmath_vec_fun_tests.cpp +++ b/untests/vmath_vec_fun_tests.cpp @@ -49,6 +49,20 @@ TEST_CASE("vmath/vec_fun") { STATIC_CHECK((int2(0,1) && int2(1,0)) == bool2(0,0)); STATIC_CHECK((int2(0,1) || int2(1,0)) == bool2(1,1)); + { + int2 v{1,2}; + CHECK(&v == &(++v)); + CHECK(v == int2{2,3}); + CHECK(&v == &(--v)); + CHECK(v == int2{1,2}); + } + { + int2 v{1,2}; + CHECK(v++ == int2{1,2}); + CHECK(v == int2{2,3}); + CHECK(v-- == int2{2,3}); + CHECK(v == int2{1,2}); + } { int2 v{1,2}; CHECK(&v == &(v += 3));