postfix and infix increment operators

This commit is contained in:
BlackMATov
2021-02-26 12:32:13 +07:00
parent 325e0e7e9f
commit dd16c24249
5 changed files with 132 additions and 0 deletions

View File

@@ -508,6 +508,26 @@ auto operator~(const vec<T, Size>& xs);
template < typename T, size_t Size >
auto operator!(const vec<T, Size>& xs);
// ++operator
template < typename T, size_t Size >
vec<T, Size>& operator++(vec<T, Size>& xs);
// --operator
template < typename T, size_t Size >
vec<T, Size>& operator--(vec<T, Size>& xs);
// operator++
template < typename T, size_t Size >
vec<T, Size> operator++(vec<T, Size>& xs, int);
// operator--
template < typename T, size_t Size >
vec<T, Size> operator--(vec<T, Size>& xs, int);
// operator+
template < typename T, typename U, size_t Size >
@@ -702,6 +722,26 @@ auto operator~(const mat<T, Size>& xs);
template < typename T, size_t Size >
auto operator!(const mat<T, Size>& xs);
// ++operator
template < typename T, size_t Size >
mat<T, Size>& operator++(mat<T, Size>& xs);
// --operator
template < typename T, size_t Size >
mat<T, Size>& operator--(mat<T, Size>& xs);
// operator++
template < typename T, size_t Size >
mat<T, Size> operator++(mat<T, Size>& xs, int);
// operator--
template < typename T, size_t Size >
mat<T, Size> operator--(mat<T, Size>& xs, int);
// operator+
template < typename T, typename U, size_t Size >

View File

@@ -187,6 +187,38 @@ namespace vmath_hpp
return map_join([](const vec<T, Size>& x){ return !x; }, xs);
}
// ++operator
template < typename T, std::size_t Size >
constexpr mat<T, Size>& operator++(mat<T, Size>& xs) {
return (xs = xs + T{1});
}
// --operator
template < typename T, std::size_t Size >
constexpr mat<T, Size>& operator--(mat<T, Size>& xs) {
return (xs = xs - T{1});
}
// operator++
template < typename T, std::size_t Size >
constexpr mat<T, Size> operator++(mat<T, Size>& xs, int) {
mat<T, Size> ys = xs;
++xs;
return ys;
}
// operator--
template < typename T, std::size_t Size >
constexpr mat<T, Size> operator--(mat<T, Size>& xs, int) {
mat<T, Size> ys = xs;
--xs;
return ys;
}
// operator+
template < typename T, typename U, std::size_t Size >

View File

@@ -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<T, Size>& operator++(vec<T, Size>& xs) {
return (xs = xs + T{1});
}
// --operator
template < typename T, std::size_t Size >
constexpr vec<T, Size>& operator--(vec<T, Size>& xs) {
return (xs = xs - T{1});
}
// operator++
template < typename T, std::size_t Size >
constexpr vec<T, Size> operator++(vec<T, Size>& xs, int) {
vec<T, Size> ys = xs;
++xs;
return ys;
}
// operator--
template < typename T, std::size_t Size >
constexpr vec<T, Size> operator--(vec<T, Size>& xs, int) {
vec<T, Size> ys = xs;
--xs;
return ys;
}
// operator+
template < typename T, typename U, std::size_t Size >

View File

@@ -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));

View File

@@ -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));