7namespace Stroika::Foundation::Traversal {
14 template <IDiscreteRangeable T, IDiscreteRangeableTraits<T> TRAITS>
15 struct DiscreteRange<T, TRAITS>::MyIteratorRep_ : Iterator<T>::IRep,
public Memory::UseBlockAllocationIfAppropriate<MyIteratorRep_> {
16 using inherited =
typename Iterator<T>::IRep;
21 : fCur{TRAITS::kLowerBound}
22 , fEnd{TRAITS::kLowerBound}
26 MyIteratorRep_ (T start, T end)
32 bool AtEnd ()
const override
36 optional<T> Current ()
const override
45 virtual optional<T> More ()
override
52 fCur = TRAITS::GetNext (fCur);
59 virtual bool Equals ([[maybe_unused]]
const typename Iterator<T>::IRep* rhs)
const override
65 virtual unique_ptr<typename Iterator<T>::IRep> Clone ()
const override
67 unique_ptr<MyIteratorRep_> tmp = make_unique<MyIteratorRep_> (fCur, fEnd);
78 template <IDiscreteRangeable T, IDiscreteRangeableTraits<T> TRAITS>
79 struct DiscreteRange<T, TRAITS>::MyIterable_ : Iterable<T> {
80 struct MyRep_ : Iterable<T>::_IRep,
public Memory::UseBlockAllocationIfAppropriate<MyRep_> {
81 using inherited =
typename Iterable<T>::_IRep;
86 : fStart{TRAITS::kLowerBound}
87 , fEnd{TRAITS::kLowerBound}
91 MyRep_ (T start, T end)
97 virtual shared_ptr<typename Iterable<T>::_IRep> Clone ()
const override
99 return Memory::MakeSharedPtr<MyRep_> (*
this);
101 virtual Iterator<T> MakeIterator ()
const override
104 return Iterator<T>{make_unique<DiscreteRange::MyIteratorRep_> ()};
107 return Iterator<T>{make_unique<DiscreteRange::MyIteratorRep_> (fStart, fEnd)};
110 virtual size_t size ()
const override
112 using SignedDifferenceType =
typename TRAITS::SignedDifferenceType;
114 return TRAITS::DifferenceToSizeT (SignedDifferenceType{0});
117 return TRAITS::DifferenceToSizeT (SignedDifferenceType{1} + DiscreteRange{fStart, fEnd}.GetDistanceSpanned ());
120 virtual bool empty ()
const override
132 : Iterable<T>{Memory::MakeSharedPtr<MyRep_> ()}
135 MyIterable_ (T start, T end)
136 : Iterable<T>{Memory::MakeSharedPtr<MyRep_> (start, end)}
146 template <IDiscreteRangeable T, IDiscreteRangeableTraits<T> TRAITS>
148 : inherited{begin, end}
150 Require (begin <= end);
152 template <IDiscreteRangeable T, IDiscreteRangeableTraits<T> TRAITS>
153 constexpr DiscreteRange<T, TRAITS>::DiscreteRange (
const optional<T>& begin,
const optional<T>& end)
154 : inherited{begin, end}
157 template <IDiscreteRangeable T, IDiscreteRangeableTraits<T> TRAITS>
158 constexpr DiscreteRange<T, TRAITS>::DiscreteRange (
const Range<T, TRAITS>& r)
161 if (not r.empty ()) {
162 Require (r.GetLowerBoundOpenness () == Openness::eClosed);
163 Require (r.GetUpperBoundOpenness () == Openness::eClosed);
164 *
this = DiscreteRange{r.GetLowerBound (), r.GetUpperBound ()};
167 template <IDiscreteRangeable T, IDiscreteRangeableTraits<T> TRAITS>
170 return DiscreteRange{TRAITS::kLowerBound, TRAITS::kUpperBound};
172 template <IDiscreteRangeable T, IDiscreteRangeableTraits<T> TRAITS>
175 return inherited::Intersection (rhs);
177 template <IDiscreteRangeable T, IDiscreteRangeableTraits<T> TRAITS>
182 template <IDiscreteRangeable T, IDiscreteRangeableTraits<T> TRAITS>
185 return inherited::UnionBounds (rhs);
187 template <IDiscreteRangeable T, IDiscreteRangeableTraits<T> TRAITS>
190 auto r = inherited::UnionBounds (rhs);
193 template <IDiscreteRangeable T, IDiscreteRangeableTraits<T> TRAITS>
196 if (this->empty ()) {
200 return this->GetDistanceSpanned () + 1;
203 template <IDiscreteRangeable T, IDiscreteRangeableTraits<T> TRAITS>
206 Require (not this->empty ());
207 return inherited::Offset (o);
209 template <IDiscreteRangeable T, IDiscreteRangeableTraits<T> TRAITS>
212 return this->empty () ? MyIterable_{} : MyIterable_{this->GetLowerBound (), this->GetUpperBound ()};
214 template <IDiscreteRangeable T, IDiscreteRangeableTraits<T> TRAITS>
219 template <IDiscreteRangeable T, IDiscreteRangeableTraits<T> TRAITS>
222 if (this->empty ()) {
226 return Iterator<T>{make_unique<MyIteratorRep_> (this->GetLowerBound (), this->GetUpperBound ())};
229 template <IDiscreteRangeable T, IDiscreteRangeableTraits<T> TRAITS>
240 template <IDiscreteRangeable T, IDiscreteRangeableTraits<T> TRAITS>
243 return lhs.Intersection (rhs);
#define AssertNotImplemented()
#define RequireNotNull(p)
bool Equals(const T *lhs, const T *rhs)
strcmp or wsccmp() as appropriate == 0
A DiscreteRange is a Range where the underlying endpoints are integral (discrete, not continuous); th...
constexpr DiscreteRange()=default
Iterable<T> is a base class for containers which easily produce an Iterator<T> to traverse them.
An Iterator<T> is a copyable object which allows traversing the contents of some container.
constexpr T GetLowerBound() const