From c28b93aadc3e49bf8cd5fabb1f9d716ea52f4e2a Mon Sep 17 00:00:00 2001 From: lisyarus Date: Fri, 5 Aug 2022 12:02:41 +0300 Subject: [PATCH] Use defaulted three-way comparison for geom::vector, point, and matrix --- libs/geom/include/psemek/geom/matrix.hpp | 38 +----------------- libs/geom/include/psemek/geom/point.hpp | 41 +------------------ libs/geom/include/psemek/geom/vector.hpp | 51 +----------------------- 3 files changed, 6 insertions(+), 124 deletions(-) diff --git a/libs/geom/include/psemek/geom/matrix.hpp b/libs/geom/include/psemek/geom/matrix.hpp index 2f5ff777..87c09ec4 100644 --- a/libs/geom/include/psemek/geom/matrix.hpp +++ b/libs/geom/include/psemek/geom/matrix.hpp @@ -45,6 +45,8 @@ namespace psemek::geom matrix & operator += (matrix const & v); matrix & operator -= (matrix const & v); + friend auto operator <=> (matrix const & m1, matrix const & m2) = default; + static matrix zero(); static matrix identity(); static matrix scalar(T const & s); @@ -84,42 +86,6 @@ namespace psemek::geom return m; } - template - bool operator == (matrix const & m1, matrix const & m2) - { - return std::equal(m1.coords, m1.coords + R * C, m2.coords); - } - - template - bool operator != (matrix const & m1, matrix const & m2) - { - return !(m1 == m2); - } - - template - bool operator < (matrix const & m1, matrix const & m2) - { - return std::lexicographical_compare(m1.coords, m1.coords + R * C, m2.coords, m2.coords + R * C); - } - - template - bool operator > (matrix const & m1, matrix const & m2) - { - return m2 < m1; - } - - template - bool operator <= (matrix const & m1, matrix const & m2) - { - return !(m2 < m1); - } - - template - bool operator >= (matrix const & m1, matrix const & m2) - { - return !(m1 < m2); - } - template matrix cast(matrix const & m) { diff --git a/libs/geom/include/psemek/geom/point.hpp b/libs/geom/include/psemek/geom/point.hpp index 63af73e2..08a7ebc7 100644 --- a/libs/geom/include/psemek/geom/point.hpp +++ b/libs/geom/include/psemek/geom/point.hpp @@ -49,6 +49,8 @@ namespace psemek::geom point & operator += (vector const & v); point & operator -= (vector const & v); + friend auto operator <=> (point const & p1, point const & p2) = default; + static point zero(); }; @@ -64,45 +66,6 @@ namespace psemek::geom return p; } - template - bool operator == (point const & p1, point const & p2) - { - for (std::size_t i = 0; i < N; ++i) - if (p1[i] != p2[i]) - return false; - return true; - } - - template - bool operator != (point const & p1, point const & p2) - { - return !(p1 == p2); - } - - template - bool operator < (point const & p1, point const & p2) - { - return std::lexicographical_compare(p1.coords, p1.coords + N, p2.coords, p2.coords + N); - } - - template - bool operator > (point const & p1, point const & p2) - { - return p2 < p1; - } - - template - bool operator <= (point const & p1, point const & p2) - { - return !(p2 < p1); - } - - template - bool operator >= (point const & p1, point const & p2) - { - return !(p1 < p2); - } - template point cast(point const & p) { diff --git a/libs/geom/include/psemek/geom/vector.hpp b/libs/geom/include/psemek/geom/vector.hpp index dad2899a..b86bddb9 100644 --- a/libs/geom/include/psemek/geom/vector.hpp +++ b/libs/geom/include/psemek/geom/vector.hpp @@ -56,61 +56,14 @@ namespace psemek::geom vector & operator += (vector const & v); vector & operator -= (vector const & v); + friend auto operator <=> (vector const & v1, vector const & v2) = default; + static vector zero(); }; template vector(Args && ...) -> vector, sizeof...(Args)>; - template - bool operator == (vector const & v1, vector const & v2) - { - return std::equal(v1.coords, v1.coords + N, v2.coords); - } - - template - bool operator != (vector const & v1, vector const & v2) - { - return !(v1 == v2); - } - - template - bool operator < (vector const & v1, vector const & v2) - { - return std::lexicographical_compare(v1.coords, v1.coords + N, v2.coords, v2.coords + N); - } - - template - bool operator > (vector const & v1, vector const & v2) - { - return v2 < v1; - } - - template - bool operator <= (vector const & v1, vector const & v2) - { - return !(v2 < v1); - } - - template - bool operator >= (vector const & v1, vector const & v2) - { - return !(v1 < v2); - } - - template - std::strong_ordering operator <=> (vector const & v1, vector const & v2) - { - for (std::size_t i = 0; i < N; ++i) - { - if (v1[i] < v2[i]) - return std::strong_ordering::less; - if (v1[i] > v2[i]) - return std::strong_ordering::greater; - } - return std::strong_ordering::equal; - } - template vector cast(vector const & v) {