135 disjointRanges.Append (intersectedSubPart);
139 return DisjointRange{disjointRanges};
141 template <
typename T,
typename RANGE_TYPE>
142 auto DisjointRange<T, RANGE_TYPE>::Union (
const DisjointRange& rhs)
const -> DisjointRange
145 Containers::Sequence<RangeType> disjointRanges{};
146 for (
const RangeType& rri : rhs.SubRanges ()) {
147 for (
const RangeType& mySR : this->SubRanges ()) {
148 RangeType sp = rri + mySR;
149 disjointRanges.Append (sp);
152 return DisjointRange{disjointRanges};
154 template <
typename T,
typename RANGE_TYPE>
155 auto DisjointRange<T, RANGE_TYPE>::UnionBounds (
const DisjointRange& rhs)
const -> RangeType
159 return Union (rhs).GetBounds ();
161 template <
typename T,
typename RANGE_TYPE>
162 Characters::String DisjointRange<T, RANGE_TYPE>::ToString (
const function<Characters::String (T)>& elt2String)
const
164 Characters::StringBuilder out;
166 for (
const RangeType& rri : SubRanges ()) {
167 out << rri.ToString (elt2String);
172 template <
typename T,
typename RANGE_TYPE>
173 void DisjointRange<T, RANGE_TYPE>::MergeIn_ (
const RangeType& r)
175 using namespace Characters::Literals;
177 if (sNoisyDebugTrace_) {
178 DbgTrace (L
"MergeIn (r = %s)", r.Format ().c_str ());
181 AssertInternalRepValid_ ();
182 if (not r.empty ()) {
183 value_type rStart{r.GetLowerBound ()};
184 value_type rEnd{r.GetUpperBound ()};
185 if (fSubRanges_.size () == 0) {
186 fSubRanges_.Append (r);
206 Assert (fSubRanges_.size () >= 1);
209 auto prevOfIterator = [
this] (
const Iterator<RangeType>& pOfI) -> Iterator<RangeType> {
210 Iterator<RangeType> result = Iterator<RangeType>::GetEmptyIterator ();
211 for (Iterator<RangeType> i = fSubRanges_.begin (); i != fSubRanges_.end (); ++i) {
220 auto findStartI = [
this, &rStart] () -> Iterator<RangeType> {
221 return fSubRanges_.Find (
222 [&rStart] (
const RangeType& r) ->
bool {
return r.GetLowerBound () >= rStart or r.Contains (rStart); });
225 Iterator<RangeType> startI = findStartI ();
226 bool extendedRange{
false};
227 if (startI == fSubRanges_.end ()) {
228 if (sNoisyDebugTrace_) {
229 DbgTrace (
"Appending subrange cuz this is past the rest: {}/{}"_f,
static_cast<double> (r.GetLowerBound ()),
230 static_cast<double> (r.GetUpperBound ()));
235 value_type prevVal = RangeType::TraitsType::GetPrevious (rStart);
236 Iterator<RangeType> i =
237 fSubRanges_.Find ([prevVal] (
const RangeType& r) ->
bool {
return r.GetUpperBound () == prevVal; });
239 Assert (i->GetUpperBound () == prevVal);
240 RangeType newValue{i->GetLowerBound (), rStart};
241 fSubRanges_.Update (i, newValue);
242 extendedRange =
true;
245 fSubRanges_.Append (r);
248 else if (r.Intersects (*startI)) {
249 RangeType newValue{min (rStart, startI->GetLowerBound ()), startI->GetUpperBound ()};
250 if (sNoisyDebugTrace_) {
251 DbgTrace (
"Updating subrange element {} from {}/{} to {}/{}"_f, fSubRanges_.IndexOf (startI),
252 static_cast<double> (startI->GetLowerBound ()),
static_cast<double> (startI->GetUpperBound ()),
253 static_cast<double> (newValue.GetLowerBound ()),
static_cast<double> (newValue.GetUpperBound ()));
255 if (*startI != newValue) {
256 fSubRanges_.Update (startI, newValue);
257 extendedRange =
true;
261 if (sNoisyDebugTrace_) {
262 DbgTrace (
"Inserting subrange element {} before {}/{} of {}/{}"_f, fSubRanges_.IndexOf (startI),
263 static_cast<double> (startI->GetLowerBound ()),
static_cast<double> (startI->GetUpperBound ()),
264 static_cast<double> (r.GetLowerBound ()),
static_cast<double> (r.GetUpperBound ()));
266 fSubRanges_.Insert (startI, r);
269 startI = findStartI ();
274 Iterator<RangeType> endI =
275 prevOfIterator (fSubRanges_.Find (startI, [rEnd] (
const RangeType& r) ->
bool { return rEnd < r.GetLowerBound (); }));
276 if (endI == fSubRanges_.end ()) {
277 endI = prevOfIterator (fSubRanges_.end ());
279 Assert (endI != fSubRanges_.end ());
280 if (endI->GetLowerBound () <= rEnd) {
281 RangeType newValue{endI->GetLowerBound (), max (rEnd, endI->GetUpperBound ())};
282 if (newValue != *endI) {
283 if (sNoisyDebugTrace_) {
284 DbgTrace (
"Updating RHS of subrange element {} from {}/{} to {}/%{}"_f, fSubRanges_.IndexOf (endI),
285 static_cast<double> (endI->GetLowerBound ()),
static_cast<double> (endI->GetUpperBound ()),
286 static_cast<double> (newValue.GetLowerBound ()),
static_cast<double> (newValue.GetUpperBound ()));
288 fSubRanges_.Update (endI, newValue);
289 extendedRange =
true;
293 if (sNoisyDebugTrace_) {
294 DbgTrace (
"Appending RHS subrange element {}/{}"_f,
static_cast<double> (r.GetLowerBound ()),
295 static_cast<double> (r.GetUpperBound ()));
297 fSubRanges_.Append (r);
300 startI = findStartI ();
305 prevOfIterator (fSubRanges_.Find (startI, [rEnd] (
const RangeType& r) ->
bool { return rEnd < r.GetLowerBound (); }));
306 if (endI == fSubRanges_.end ()) {
307 endI = prevOfIterator (fSubRanges_.end ());
309 Assert (endI != fSubRanges_.end ());
314 if (extendedRange and startI != fSubRanges_.end ()) {
315 for (
auto i = startI; i != endI and i != fSubRanges_.end ();) {
316 if (i != startI and i != endI) {
317 if (sNoisyDebugTrace_) {
318 DbgTrace (
"Removing redundant subrange element {} from {} to {}"_f, fSubRanges_.IndexOf (i),
319 static_cast<double> (i->GetLowerBound ()),
static_cast<double> (i->GetUpperBound ()));
321 i = fSubRanges_.erase (i);
330 AssertInternalRepValid_ ();
332 Ensure (r.GetLowerBoundOpenness () == Openness::eOpen or Contains (r.GetLowerBound ()));
333 Ensure (r.GetUpperBoundOpenness () == Openness::eOpen or Contains (r.GetUpperBound ()));
334 Ensure (GetBounds ().Contains (r));
337 if (sNoisyDebugTrace_) {
338 DbgTrace (L
"MergeIn (r = %s)", r.Format ().c_str ());
342 template <
typename T,
typename RANGE_TYPE>
343 inline void DisjointRange<T, RANGE_TYPE>::AssertInternalRepValid_ ()
const
346 optional<RangeType> lastRangeSeenSoFar;
347 for (
const RangeType& r : fSubRanges_) {
348 Assert (not r.empty ());
349 if (lastRangeSeenSoFar) {
350 Assert (lastRangeSeenSoFar->GetUpperBound () <= r.GetLowerBound ());
351 Assert (not lastRangeSeenSoFar->Intersects (r));
353 value_type nextVal = RangeType::TraitsType::GetNext (lastRangeSeenSoFar->GetUpperBound ());
354 Assert (nextVal < r.GetLowerBound ());
356 lastRangeSeenSoFar = r;
360 template <
typename T,
typename RANGE_TYPE>