struct SN needs a strict weak ordering operator <

...so it can be used with std::sort in impSolve() (further down in
basegfx/source/polygon/b2dpolypolygoncutter.cxx).  At least on macOS with a
LLVM 20 trunk libc++ in hardened mode, JunitTest_sfx2_complex failed with

> ~/llvm/inst/bin/../include/c++/v1/__debug_utils/strict_weak_ordering_check.h:59: assertion __comp(*(__first + __a), *(__first + __b)) failed: Your comparator is not a valid strict-weak ordering

To simplify the new implementation of struct SN operator <, add a B2DPoint
operator <=> (but whose implementation would cause

> In file included from /home/tdf/lode/jenkins/workspace/android_arm/basegfx/source/curve/b2dbeziertools.cxx:21:
> In file included from /home/tdf/lode/jenkins/workspace/android_arm/include/basegfx/curve/b2dcubicbezier.hxx:22:
> /home/tdf/lode/jenkins/workspace/android_arm/include/basegfx/point/b2dpoint.hxx:129:41: error: invalid operands to binary expression ('tuple<const double &, const double &>' and 'tuple<const double &, const double &>')
>         { return std::tie(a.mnX, a.mnY) <=> std::tie(b.mnX, b.mnY); }
>                  ~~~~~~~~~~~~~~~~~~~~~~ ^   ~~~~~~~~~~~~~~~~~~~~~~

etc. on Android with NDK 23.2, see
<https://ci.libreoffice.org/job/gerrit_android_arm/43174/>, so work around that
in the implementation for now).

Change-Id: I9f46d39dc9e9024fe9ac59413c44e49642282c8b
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/175622
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <stephan.bergmann@allotropia.de>
This commit is contained in:
Stephan Bergmann 2024-10-25 08:20:19 +02:00
parent 2b8d794e44
commit 41ab6a5dfa
2 changed files with 20 additions and 16 deletions

View file

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

View file

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