7namespace Stroika::Foundation::Traversal {
14 template <
typename T,
typename 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 virtual void More (optional<T>* result,
bool advance)
override
42 fCur = TRAITS::GetNext (fCur);
49 virtual bool Equals ([[maybe_unused]]
const typename Iterator<T>::IRep* rhs)
const override
55 virtual unique_ptr<typename Iterator<T>::IRep> Clone ()
const override
57 unique_ptr<MyIteratorRep_> tmp = make_unique<MyIteratorRep_> (fCur, fEnd);
68 template <
typename T,
typename TRAITS>
69 struct DiscreteRange<T, TRAITS>::MyIterable_ : Iterable<T> {
70 struct MyRep_ : Iterable<T>::_IRep,
public Memory::UseBlockAllocationIfAppropriate<MyRep_> {
71 using inherited =
typename Iterable<T>::_IRep;
76 : fStart{TRAITS::kLowerBound}
77 , fEnd{TRAITS::kLowerBound}
81 MyRep_ (T start, T end)
87 virtual shared_ptr<typename Iterable<T>::_IRep> Clone ()
const override
89 return Memory::MakeSharedPtr<MyRep_> (*
this);
91 virtual Iterator<T> MakeIterator ()
const override
94 return Iterator<T>{make_unique<DiscreteRange::MyIteratorRep_> ()};
97 return Iterator<T>{make_unique<DiscreteRange::MyIteratorRep_> (fStart, fEnd)};
100 virtual size_t size ()
const override
102 using SignedDifferenceType =
typename TRAITS::SignedDifferenceType;
104 return TRAITS::DifferenceToSizeT (SignedDifferenceType{0});
107 return TRAITS::DifferenceToSizeT (SignedDifferenceType{1} + DiscreteRange{fStart, fEnd}.GetDistanceSpanned ());
110 virtual bool empty ()
const override
122 : Iterable<T>{Memory::MakeSharedPtr<MyRep_> ()}
125 MyIterable_ (T start, T end)
126 : Iterable<T>{Memory::MakeSharedPtr<MyRep_> (start, end)}
136 template <
typename T,
typename TRAITS>
138 : inherited{begin, end}
140 Require (begin <= end);
142 template <
typename T,
typename TRAITS>
143 constexpr DiscreteRange<T, TRAITS>::DiscreteRange (
const optional<T>& begin,
const optional<T>& end)
144 : inherited{begin, end}
147 template <
typename T,
typename TRAITS>
148 constexpr DiscreteRange<T, TRAITS>::DiscreteRange (
const Range<T, TRAITS>& r)
151 if (not r.empty ()) {
152 Require (r.GetLowerBoundOpenness () == Openness::eClosed);
153 Require (r.GetUpperBoundOpenness () == Openness::eClosed);
154 *
this = DiscreteRange{r.GetLowerBound (), r.GetUpperBound ()};
157 template <
typename T,
typename TRAITS>
160 return DiscreteRange{TRAITS::kLowerBound, TRAITS::kUpperBound};
162 template <
typename T,
typename TRAITS>
165 return inherited::Intersection (rhs);
167 template <
typename T,
typename TRAITS>
172 template <
typename T,
typename TRAITS>
175 return inherited::UnionBounds (rhs);
177 template <
typename T,
typename TRAITS>
180 auto r = inherited::UnionBounds (rhs);
183 template <
typename T,
typename TRAITS>
186 if (this->empty ()) {
190 return this->GetDistanceSpanned () + 1;
193 template <
typename T,
typename TRAITS>
196 Require (not this->empty ());
197 return inherited::Offset (o);
199 template <
typename T,
typename TRAITS>
202 return this->empty () ? MyIterable_{} : MyIterable_{this->GetLowerBound (), this->GetUpperBound ()};
204 template <
typename T,
typename TRAITS>
209 template <
typename T,
typename TRAITS>
212 if (this->empty ()) {
216 return Iterator<T>{make_unique<MyIteratorRep_> (this->GetLowerBound (), this->GetUpperBound ())};
219 template <
typename T,
typename TRAITS>
230 template <
typename T,
typename TRAITS>
233 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