Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
DiscreteRange.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
6
7namespace Stroika::Foundation::Traversal {
8
9 /*
10 ********************************************************************************
11 ***************** DiscreteRange<T, TRAITS>::MyIteratorRep_ *********************
12 ********************************************************************************
13 */
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;
17 T fCur;
18 T fEnd;
19 bool fAtEnd;
20 MyIteratorRep_ ()
21 : fCur{TRAITS::kLowerBound}
22 , fEnd{TRAITS::kLowerBound}
23 , fAtEnd{true}
24 {
25 }
26 MyIteratorRep_ (T start, T end)
27 : fCur{start}
28 , fEnd{end}
29 , fAtEnd{false}
30 {
31 }
32 virtual void More (optional<T>* result, bool advance) override
33 {
34 RequireNotNull (result);
35 *result = nullopt;
36 if (advance) {
37 Require (not fAtEnd);
38 if (fCur == fEnd) {
39 fAtEnd = true;
40 }
41 else {
42 fCur = TRAITS::GetNext (fCur);
43 }
44 }
45 if (not fAtEnd) {
46 *result = fCur;
47 }
48 }
49 virtual bool Equals ([[maybe_unused]] const typename Iterator<T>::IRep* rhs) const override
50 {
51 RequireNotNull (rhs);
53 return false;
54 }
55 virtual unique_ptr<typename Iterator<T>::IRep> Clone () const override
56 {
57 unique_ptr<MyIteratorRep_> tmp = make_unique<MyIteratorRep_> (fCur, fEnd);
58 tmp->fAtEnd = fAtEnd;
59 return tmp;
60 }
61 };
62
63 /*
64 ********************************************************************************
65 ***************** DiscreteRange<T, TRAITS>::MyIterable_ ************************
66 ********************************************************************************
67 */
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;
72 T fStart;
73 T fEnd;
74 bool fForcedEnd;
75 MyRep_ ()
76 : fStart{TRAITS::kLowerBound}
77 , fEnd{TRAITS::kLowerBound}
78 , fForcedEnd{true}
79 {
80 }
81 MyRep_ (T start, T end)
82 : fStart{start}
83 , fEnd{end}
84 , fForcedEnd{false}
85 {
86 }
87 virtual shared_ptr<typename Iterable<T>::_IRep> Clone () const override
88 {
89 return Memory::MakeSharedPtr<MyRep_> (*this);
90 }
91 virtual Iterator<T> MakeIterator () const override
92 {
93 if (fForcedEnd) {
94 return Iterator<T>{make_unique<DiscreteRange::MyIteratorRep_> ()};
95 }
96 else {
97 return Iterator<T>{make_unique<DiscreteRange::MyIteratorRep_> (fStart, fEnd)};
98 }
99 }
100 virtual size_t size () const override
101 {
102 using SignedDifferenceType = typename TRAITS::SignedDifferenceType;
103 if (fForcedEnd) {
104 return TRAITS::DifferenceToSizeT (SignedDifferenceType{0});
105 }
106 else {
107 return TRAITS::DifferenceToSizeT (SignedDifferenceType{1} + DiscreteRange{fStart, fEnd}.GetDistanceSpanned ());
108 }
109 }
110 virtual bool empty () const override
111 {
112 if (fForcedEnd) {
113 return true;
114 }
115 else {
116 return false;
117 //return fStart == fEnd;
118 }
119 }
120 };
121 MyIterable_ ()
122 : Iterable<T>{Memory::MakeSharedPtr<MyRep_> ()}
123 {
124 }
125 MyIterable_ (T start, T end)
126 : Iterable<T>{Memory::MakeSharedPtr<MyRep_> (start, end)}
127 {
128 }
129 };
130
131 /*
132 ********************************************************************************
133 ***************************** DiscreteRange<T> *********************************
134 ********************************************************************************
135 */
136 template <typename T, typename TRAITS>
137 constexpr DiscreteRange<T, TRAITS>::DiscreteRange (T begin, T end)
138 : inherited{begin, end}
139 {
140 Require (begin <= end);
141 }
142 template <typename T, typename TRAITS>
143 constexpr DiscreteRange<T, TRAITS>::DiscreteRange (const optional<T>& begin, const optional<T>& end)
144 : inherited{begin, end}
145 {
146 }
147 template <typename T, typename TRAITS>
148 constexpr DiscreteRange<T, TRAITS>::DiscreteRange (const Range<T, TRAITS>& r)
149 {
150 // Could do more efficiently
151 if (not r.empty ()) {
152 Require (r.GetLowerBoundOpenness () == Openness::eClosed);
153 Require (r.GetUpperBoundOpenness () == Openness::eClosed);
154 *this = DiscreteRange{r.GetLowerBound (), r.GetUpperBound ()};
155 }
156 }
157 template <typename T, typename TRAITS>
159 {
160 return DiscreteRange{TRAITS::kLowerBound, TRAITS::kUpperBound};
161 }
162 template <typename T, typename TRAITS>
164 {
165 return inherited::Intersection (rhs);
166 }
167 template <typename T, typename TRAITS>
169 {
170 return DiscreteRange{inherited::Intersection (rhs)};
171 }
172 template <typename T, typename TRAITS>
174 {
175 return inherited::UnionBounds (rhs);
176 }
177 template <typename T, typename TRAITS>
179 {
180 auto r = inherited::UnionBounds (rhs);
181 return DiscreteRange{r.GetLowerBound (), r.GetUpperBound ()};
182 }
183 template <typename T, typename TRAITS>
184 constexpr typename DiscreteRange<T, TRAITS>::UnsignedDifferenceType DiscreteRange<T, TRAITS>::GetNumberOfContainedPoints () const
185 {
186 if (this->empty ()) {
187 return 0;
188 }
189 else {
190 return this->GetDistanceSpanned () + 1;
191 }
192 }
193 template <typename T, typename TRAITS>
194 constexpr auto DiscreteRange<T, TRAITS>::Offset (SignedDifferenceType o) const -> DiscreteRange
195 {
196 Require (not this->empty ());
197 return inherited::Offset (o);
198 }
199 template <typename T, typename TRAITS>
201 {
202 return this->empty () ? MyIterable_{} : MyIterable_{this->GetLowerBound (), this->GetUpperBound ()};
203 }
204 template <typename T, typename TRAITS>
206 {
207 return Elements ();
208 }
209 template <typename T, typename TRAITS>
211 {
212 if (this->empty ()) {
214 }
215 else {
216 return Iterator<T>{make_unique<MyIteratorRep_> (this->GetLowerBound (), this->GetUpperBound ())};
217 }
218 }
219 template <typename T, typename TRAITS>
221 {
223 }
224
225 /*
226 ********************************************************************************
227 *********************************** operator^ **********************************
228 ********************************************************************************
229 */
230 template <typename T, typename TRAITS>
232 {
233 return lhs.Intersection (rhs);
234 }
235
236}
#define AssertNotImplemented()
Definition Assertions.h:401
#define RequireNotNull(p)
Definition Assertions.h:347
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...
Iterable<T> is a base class for containers which easily produce an Iterator<T> to traverse them.
Definition Iterable.h:237
An Iterator<T> is a copyable object which allows traversing the contents of some container....
Definition Iterator.h:225
constexpr T GetLowerBound() const
Definition Range.inl:394