4#include "Stroika/Foundation/Containers/SortedMapping.h"
8namespace Stroika::Foundation::Traversal {
12 template <Traversal::IRange RANGETYPE, Common::IPotentiallyComparer<
typename RANGETYPE::value_type> RANGE_ELT_COMPARER>
13 inline bool IsPartition (
const Iterable<RANGETYPE>& iterable, RANGE_ELT_COMPARER comparer)
15 using Common::KeyValuePair;
16 using Containers::SortedMapping;
17 using Debug::TraceContextBumper;
18 TraceContextBumper ctx{
"IsPartition_Helper_"};
19 using namespace Traversal;
20 using value_type =
typename RANGETYPE::value_type;
21 SortedMapping<value_type, RANGETYPE> tmp;
22 for (
const RANGETYPE& r : iterable) {
23 tmp.Add (r.GetLowerBound (), r);
25 optional<value_type> upperBoundSeenSoFar;
26 Openness upperBoundSeenSoFarOpenness{};
27 for (
const KeyValuePair<value_type, RANGETYPE>& i : tmp) {
29 if (upperBoundSeenSoFar) {
30 if (not comparer (*upperBoundSeenSoFar, i.fValue.GetLowerBound ())) {
35 if (upperBoundSeenSoFarOpenness == i.fValue.GetLowerBoundOpenness ()) {
41 upperBoundSeenSoFar = i.fValue.GetUpperBound ();
42 upperBoundSeenSoFarOpenness = i.fValue.GetUpperBoundOpenness ();
46 template <Traversal::IRange RANGETYPE>
50 iterable, [] (
typename RANGETYPE::value_type lhs,
typename RANGETYPE::value_type rhs) {
return Math::NearlyEquals (lhs, rhs); });
bool IsPartition(const Iterable< RANGETYPE > &iterable)
Iterable<T> is a base class for containers which easily produce an Iterator<T> to traverse them.