diff options
-rw-r--r-- | basegfx/source/polygon/b2dpolypolygoncutter.cxx | 21 | ||||
-rw-r--r-- | include/basegfx/point/b2dpoint.hxx | 15 |
2 files changed, 20 insertions, 16 deletions
diff --git a/basegfx/source/polygon/b2dpolypolygoncutter.cxx b/basegfx/source/polygon/b2dpolypolygoncutter.cxx index 1cf414c1cc56..6feeb1685bfc 100644 --- a/basegfx/source/polygon/b2dpolypolygoncutter.cxx +++ b/basegfx/source/polygon/b2dpolypolygoncutter.cxx @@ -17,7 +17,6 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#include <basegfx/numeric/ftools.hxx> #include <basegfx/polygon/b2dpolypolygoncutter.hxx> #include <basegfx/point/b2dpoint.hxx> #include <basegfx/vector/b2dvector.hxx> @@ -32,6 +31,7 @@ #include <vector> #include <algorithm> #include <numeric> +#include <tuple> namespace basegfx { @@ -72,23 +72,12 @@ namespace basegfx public: PN* mpPN; + // For this to be a strict weak ordering, the assumption is that none of the involved + // maPoint coordinates are NaN: bool operator<(const SN& rComp) const { - if(fTools::equal(mpPN->maPoint.getX(), rComp.mpPN->maPoint.getX())) - { - if(fTools::equal(mpPN->maPoint.getY(), rComp.mpPN->maPoint.getY())) - { - return (mpPN->mnI < rComp.mpPN->mnI); - } - else - { - return fTools::less(mpPN->maPoint.getY(), rComp.mpPN->maPoint.getY()); - } - } - else - { - return fTools::less(mpPN->maPoint.getX(), rComp.mpPN->maPoint.getX()); - } + return std::tie(mpPN->maPoint, mpPN->mnI) + < std::tie(rComp.mpPN->maPoint, rComp.mpPN->mnI); } }; diff --git a/include/basegfx/point/b2dpoint.hxx b/include/basegfx/point/b2dpoint.hxx index ce16965de042..94140aa6f5e1 100644 --- a/include/basegfx/point/b2dpoint.hxx +++ b/include/basegfx/point/b2dpoint.hxx @@ -19,7 +19,9 @@ #pragma once +#include <compare> #include <ostream> +#include <tuple> #include <basegfx/tuple/b2dtuple.hxx> #include <basegfx/point/b2ipoint.hxx> @@ -122,6 +124,19 @@ namespace basegfx { return static_cast<const B2DPoint&>( ::basegfx::B2DTuple::getEmptyTuple() ); } + + friend auto operator <=>(B2DPoint const & a, B2DPoint const & b) + { + // Avoid compilation failure with Android NDK 23.2, where std::tuple operator <=> isn't + // yet implemented (and where __cpp_lib_three_way_comparison happens to not be defined + // in <compare>, so discriminate on that): +#if defined __cpp_lib_three_way_comparison + return std::tie(a.mnX, a.mnY) <=> std::tie(b.mnX, b.mnY); +#else + auto const comp = a.mnX <=> b.mnX; + return comp == 0 ? a.mnY <=> b.mnY : comp; +#endif + } }; // external operators |