227 using this_iterator = ITERATOR_TYPE;
228 using iterator = get_iterator<ITERATOR_TYPE>;
229 using const_iterator = get_const_iterator<iterator>;
232 using THIS_RAW_RANGE = ::range<ITERATOR_TYPE>;
233 using RAW_RANGE = ::range<iterator>;
234 using CONST_RAW_RANGE = ::range<const_iterator>;
237 using THIS_RANGE = ::range<ITERATOR_TYPE>;
238 using RANGE = ::range<iterator>;
239 using CONST_RANGE = ::range<const_iterator>;
242 using ITEM_POINTER = get_type_item_pointer<iterator>;
245 using THIS_ITEM = get_iterator_item<this_iterator>;
246 using ITEM = non_const<THIS_ITEM>;
248 using ARG_ITEM = argument_of < ITEM >;
251 this_iterator m_begin;
260 constexpr range(nullptr_t) :
261 range(
nullptr,
nullptr, e_range_none)
267 range(
nullptr,
nullptr, e_range_none)
272 template<::collection::count count>
273 constexpr range(
const ITEM(&array)[count], enum_range erange = e_range_none)
275 (!prototype_character < ITEM >)
276 : range(array, count, erange)
309 template<typed_range<iterator> TYPED_RANGE>
310 constexpr range(
const TYPED_RANGE& range)
311 requires(!::std::is_same_v < TYPED_RANGE, THIS_RANGE >) :
312 m_begin((this_iterator)range.begin()),
313 m_end((this_iterator)range.end()),
314 m_erange(range.m_erange)
321 constexpr range(
const range & range) :
322 m_begin(range.m_begin),
324 m_erange(range.m_erange)
330 constexpr range(range && range) :
331 m_begin(range.m_begin),
333 m_erange(range.m_erange)
336 range.m_begin =
nullptr;
337 range.m_end =
nullptr;
338 range.m_erange = e_range_none;
343 template<
typename TYPE>
344 constexpr range(TYPE *& p) :
345 m_begin((this_iterator)p),
346 m_end((this_iterator)find_first_null_character(p)),
348 m_erange(e_range_none)
354 template<prototype_
integral INTEGRAL>
355 constexpr range(this_iterator begin, INTEGRAL count, enum_range erange = e_range_none) :
356 m_begin(begin), m_end(begin + count), m_erange(erange)
360 constexpr range(this_iterator begin, this_iterator end, enum_range erange = e_range_none) :
361 m_begin(begin), m_end(end), m_erange(erange)
365 template<::comparison::equality<ITEM> EQUALITY>
366 constexpr range(this_iterator begin, EQUALITY equality) :
368 m_end((this_iterator)find_first_null_character(begin, equality)),
370 m_erange(e_range_none)
378 range & operator =(
const range & range)
381 m_begin = range.m_begin;
383 m_erange = range.m_erange;
390 range & operator=(range && range)
393 m_begin = range.m_begin;
395 m_erange = range.m_erange;
396 range.m_begin =
nullptr;
397 range.m_end =
nullptr;
398 range.m_erange = e_range_none;
405 void add_initializer_list(const ::std::initializer_list<ITEM> & initializer_list)
416 this->m_begin =
nullptr;
418 this->m_end =
nullptr;
420 this->m_erange = e_range_none;
431 template < prototype_
integral START >
432 constexpr THIS_RAW_RANGE operator()(START start)
const
435 return { m_begin + start, m_end };
440 template < prototype_
integral START, prototype_
integral COUNT >
441 constexpr THIS_RAW_RANGE operator()(START start, COUNT count)
const
444 return { m_begin + start, (count < 0) ? m_end + count + 1 : m_begin + start + count };
457 ::collection::count array_get_count()
const {
return this->m_end - this->m_begin; }
459 template < same_as < ITEM > A_ITEM >
460 void block_concatenate_to(A_ITEM * & p)
468 auto psrc = this->m_begin;
483 ::memory_copy(p, this->m_begin, s*
sizeof(ITEM));
491 template < prototype_
integral START >
492 constexpr THIS_RAW_RANGE operator()(START start)
495 return { m_begin + start, m_end };
500 template < prototype_
integral START, prototype_
integral COUNT >
501 THIS_RAW_RANGE operator()(START start, COUNT count)
504 return { m_begin + start, (count < 0) ? m_end + count + 1 : m_begin + start + count };
509 constexpr auto index_of(const_iterator p)
const
512 return p - (const_iterator)this->begin();
517 this_iterator & begin()
522 this_iterator & end()
527 const_iterator begin()
const
529 return (const_iterator) m_begin;
532 const_iterator end()
const
534 return (const_iterator) m_end;
537 this_iterator & begin(this_iterator begin)
539 return m_begin = begin;
542 this_iterator & end(this_iterator end)
548 auto & first()
const;
550 constexpr this_iterator data()
556 constexpr const this_iterator data()
const
562 static constexpr memsize item_size()
567 constexpr ::collection::count size()
const
569 return this->m_end - this->m_begin;
572 constexpr memsize size_in_bytes()
const
574 return this->size() * this->item_size();
578 constexpr bool is_empty()
const
583 constexpr bool is_set()
const
589 inline bool operator!()
const
595 constexpr bool is_before_begin(const_iterator iterator)
const
598 return ::iterator_is_before_begin(iterator, m_begin);
603 constexpr bool is_end(const_iterator iterator)
const
606 return ::iterator_is_end(iterator, m_end);
611 constexpr bool is_iterator_ok(const_iterator iterator)
const
614 return !this->is_end(iterator);
620 constexpr bool is_this_range(
const range& range)
const
623 return this->m_begin == range.m_begin && this->m_end == range.m_end;
661 constexpr THIS_RAW_RANGE _start_range(memsize start)
const
664 return { (ITERATOR_TYPE) (this->begin() + start), (ITERATOR_TYPE)this->end() };
669 constexpr THIS_RAW_RANGE _end_range(const_iterator end)
const
672 return { (ITERATOR_TYPE) this->begin(), (ITERATOR_TYPE)end };
677 constexpr THIS_RAW_RANGE _start_count_range(memsize start, memsize count)
const
681 (ITERATOR_TYPE) (this->begin() + start),
682 (ITERATOR_TYPE) (((count >= 0) ? ::clipped_add(this->begin(), start + count, this->begin(), this->end()) : ::clipped_add(
683 this->end(), count + 1, this->begin(), this->end()))) };
688 static constexpr bool _initialize_equals(
bool & b,
const THIS_RAW_RANGE & range,
const THIS_RAW_RANGE & rangeBlock)
698 template<::comparison::equality<ITEM> EQUALITY>
699 static constexpr bool _static_equals(THIS_RAW_RANGE range, THIS_RAW_RANGE rangeBlock, EQUALITY equality)
702 while (range.begin() < range.end())
705 if (!equality.equals(*range.begin(), *rangeBlock.begin()))
714 rangeBlock.begin()++;
723 template<::comparison::equality<ITEM> EQUALITY>
724 static constexpr bool static_equals(
const THIS_RAW_RANGE & range,
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
727 auto sizeRange = range.size();
729 return sizeRange != rangeBlock.size() ? false :
732 _static_equals(range, rangeBlock, equality)
738 template<::comparison::equality<ITEM> EQUALITY>
739 constexpr bool _equals(
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
const
742 return _static_equals(*
this, rangeBlock, equality);
747 template<::comparison::equality<ITEM> EQUALITY>
748 constexpr bool equals(
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
const
751 return static_equals(*
this, rangeBlock, equality);
875 template<::comparison::ordering<ITEM> ORDERING>
876 static constexpr auto _static_order(THIS_RAW_RANGE range, THIS_RAW_RANGE rangeBlock, ORDERING ordering)
879 using TORDERING =
decltype(ordering.order(*range.begin(), *rangeBlock.begin()));
884 auto order = ordering.order(*range.begin(), *rangeBlock.begin());
895 rangeBlock.begin()++;
897 }
while (!range.is_end(range.begin()) && !rangeBlock.is_end(rangeBlock.begin()));
899 return ::as< TORDERING, ::std::strong_ordering >(range.size() <=> rangeBlock.size());
906 template<::comparison::ordering<ITEM> ORDERING>
907 static constexpr auto
908 static_order(
const THIS_RAW_RANGE & range,
const THIS_RAW_RANGE & rangeBlock, ORDERING ordering)
912 return _static_order(range, rangeBlock, ordering);
936 template<::comparison::ordering<ITEM> ORDERING>
937 constexpr auto _order(
const THIS_RAW_RANGE & rangeBlock, ORDERING ordering)
const
940 return _static_order(*
this, rangeBlock, ordering);
945 template<::comparison::ordering<ITEM> ORDERING>
946 constexpr auto order(
const THIS_RAW_RANGE & rangeBlock, ORDERING ordering)
const
949 return static_order(*
this, rangeBlock, ordering);
1001 static bool _initialize_find(const_iterator & p,
const THIS_RAW_RANGE & range,
const THIS_RAW_RANGE & rangeBlock)
1004 if (range.is_empty())
1018 template<::comparison::equality<ITEM> EQUALITY>
1019 static const_iterator _static_find(THIS_RAW_RANGE range,
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
1022 auto pEnd = range.end() - rangeBlock.size();
1027 auto p = range.begin();
1029 auto pBlock = rangeBlock.begin();
1034 if (!equality.equals(*p, *pBlock))
1043 if (rangeBlock.is_end(pBlock))
1046 return range.begin();
1056 }
while (range.begin() <= pEnd);
1063 template<::comparison::equality<ITEM> EQUALITY>
1064 static const_iterator static_find(
const THIS_RAW_RANGE & range,
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
1069 if (_initialize_find(p, range, rangeBlock))
1076 return _static_find(range, rangeBlock, equality);
1081 template<::comparison::equality<ITEM> EQUALITY>
1082 constexpr const_iterator _find(
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
const
1085 return _static_find(*
this, rangeBlock, equality);
1090 template<::comparison::equality<ITEM> EQUALITY>
1091 constexpr const_iterator find(
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
const
1094 return static_find(*
this, rangeBlock, equality);
1127 static bool _initialize_rear_find(const_iterator & p,
const THIS_RAW_RANGE & range,
const THIS_RAW_RANGE & rangeBlock)
1130 if (rangeBlock.is_empty())
1139 if (range.is_empty())
1153 template<::comparison::equality<ITEM> EQUALITY>
1154 static const_iterator _static_rear_find(THIS_RAW_RANGE range,
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
1160 auto p = range.end();
1162 auto pBlock = rangeBlock.end() - 1;
1167 if (!equality.equals(*p, *pBlock))
1178 if (rangeBlock.is_before_begin(pBlock))
1189 }
while (!range.is_before_begin(range.end()));
1196 template<::comparison::equality<ITEM> EQUALITY>
1197 static const_iterator
1198 static_rear_find(
const THIS_RAW_RANGE & range,
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
1203 if (_initialize_rear_find(p, range, rangeBlock))
1210 return _static_rear_find(range, rangeBlock, equality);
1215 template<::comparison::equality<ITEM> EQUALITY>
1216 constexpr const_iterator _rear_find(
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
const
1219 return _static_rear_find(*
this, rangeBlock, equality);
1224 template<::comparison::equality<ITEM> EQUALITY>
1225 constexpr const_iterator rear_find(
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
const
1228 return static_rear_find(*
this, rangeBlock, equality);
1320 template <
typename ITEM2 >
1321 static constexpr bool
1322 _initialize_find_first_character(const_iterator & p,
const THIS_RAW_RANGE & range, ITEM2
item)
noexcept
1325 if (range.is_empty())
1348 template<::comparison::equality<ITEM> EQUALITY>
1349 static constexpr const_iterator
1350 _static_find_first_character(THIS_RAW_RANGE range, ITEM
item, EQUALITY equality)
noexcept
1356 if (equality.equals(*range.begin(),
item))
1362 return range.begin();
1371 }
while (!range.is_end(range.begin()));
1381 template<::comparison::equality<ITEM> EQUALITY>
1382 static constexpr const_iterator
1383 static_find_first_character(
const THIS_RAW_RANGE & range, ITEM
item, EQUALITY equality)
noexcept
1388 if (_initialize_find_first_character(p, range,
item))
1395 return _static_find_first_character(range,
item, equality);
1400 template<::comparison::equality<ITEM> EQUALITY>
1401 constexpr const_iterator _find_first_character(ITEM
item, EQUALITY equality)
const
1404 return _static_find_first_character(*
this,
item, equality);
1409 template<::comparison::equality<ITEM> EQUALITY>
1410 constexpr const_iterator find_first_character(ITEM
item, EQUALITY equality)
const
1413 return static_find_first_character(*
this,
item, equality);
1419 static constexpr bool
1420 _initialize_find_first_character_in(const_iterator & p,
const THIS_RAW_RANGE & range,
const THIS_RAW_RANGE & rangeBlock)
noexcept
1423 if (range.is_empty())
1432 if (rangeBlock.is_empty())
1446 template<::comparison::equality<ITEM> EQUALITY>
1447 static constexpr const_iterator
1448 _static_find_first_character_in(THIS_RAW_RANGE range,
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
noexcept
1454 auto pBlockScan = rangeBlock.begin();
1459 if (equality.equals(*range.begin(), *pBlockScan))
1465 return range.begin();
1471 }
while (!rangeBlock.is_end(pBlockScan));
1478 }
while (!range.is_end(range.begin()));
1488 template<::comparison::equality<ITEM> EQUALITY>
1489 static constexpr const_iterator
1490 static_find_first_character_in(
const THIS_RAW_RANGE & range,
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
noexcept
1495 if (_initialize_find_first_character_in(p, range, rangeBlock))
1502 return _static_find_first_character_in(range, rangeBlock, equality);
1507 template<::comparison::equality<ITEM> EQUALITY>
1508 constexpr const_iterator _find_first_character_in(
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
const
1511 return _static_find_first_character_in(*
this, rangeBlock, equality);
1516 template<::comparison::equality<ITEM> EQUALITY>
1517 constexpr const_iterator find_first_character_in(
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
const
1520 return static_find_first_character_in(*
this, rangeBlock, equality);
1563 static constexpr bool
1564 _initialize_rear_find_first_character_in(const_iterator & p,
const THIS_RAW_RANGE & range,
const THIS_RAW_RANGE & rangeBlock)
noexcept
1567 if (range.is_empty())
1576 if (rangeBlock.is_empty())
1590 template<::comparison::equality<ITEM> EQUALITY>
1591 static constexpr const_iterator
1592 _static_rear_find_first_character_in(THIS_RAW_RANGE range,
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
noexcept
1598 auto pBlockScan = rangeBlock.begin();
1603 if (equality.equals(*range.end(), *pBlockScan))
1615 }
while (!rangeBlock.is_end(pBlockScan));
1619 }
while (!range.is_before_begin(range.end()));
1626 template<::comparison::equality<ITEM> EQUALITY>
1627 static constexpr const_iterator
1628 static_rear_find_first_character_in(THIS_RAW_RANGE range,
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
noexcept
1633 if (_initialize_rear_find_first_character_in(p, range, rangeBlock))
1642 return _static_rear_find_first_character_in(range, rangeBlock, equality);
1647 template<::comparison::equality<ITEM> EQUALITY>
1648 constexpr const_iterator _rear_find_first_character_in(
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
const
1651 return _static_rear_find_first_character_in(*
this, rangeBlock, equality);
1656 template<::comparison::equality<ITEM> EQUALITY>
1657 constexpr const_iterator rear_find_first_character_in(
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
const
1660 return static_rear_find_first_character_in(*
this, rangeBlock, equality);
1703 static constexpr bool _initialize_skip(const_iterator & p,
const THIS_RAW_RANGE & range)
noexcept
1706 if (range.is_empty())
1720 template<::comparison::equality<ITEM> EQUALITY>
1721 static constexpr const_iterator _static_skip(THIS_RAW_RANGE range, ARG_ITEM
item, EQUALITY equality)
noexcept
1727 if (!equality.equals(*range.begin(),
item))
1730 return range.begin();
1736 }
while (!range.is_end(range.begin()));
1738 return range.begin();
1743 template<::comparison::equality<ITEM> EQUALITY>
1744 static constexpr const_iterator
1745 static_skip(
const THIS_RAW_RANGE & range, ARG_ITEM
item, EQUALITY equality)
noexcept
1750 if (_initialize_skip(p, range))
1757 return _static_skip(range,
item, equality);
1762 template<::comparison::equality<ITEM> EQUALITY>
1763 constexpr const_iterator _skip(ARG_ITEM
item, EQUALITY equality)
const
1766 return _static_skip(*
this,
item, equality);
1771 template<::comparison::equality<ITEM> EQUALITY>
1772 constexpr const_iterator skip(ARG_ITEM
item, EQUALITY equality)
const
1775 return static_skip(*
this,
item, equality);
1780 static constexpr bool _initialize_rear_skip(const_iterator & p,
const THIS_RAW_RANGE & range)
noexcept
1783 if (range.is_empty())
1797 template<::comparison::equality<ITEM> EQUALITY>
1798 static constexpr const_iterator _static_rear_skip(THIS_RAW_RANGE range, ARG_ITEM
item, EQUALITY equality)
noexcept
1806 if (range.is_before_begin(range.end()))
1813 if (!equality.equals(*range.end(),
item))
1816 return range.begin();
1827 template<::comparison::equality<ITEM> EQUALITY>
1828 static constexpr const_iterator
1829 static_rear_skip(
const THIS_RAW_RANGE & range, ARG_ITEM
item, EQUALITY equality)
noexcept
1834 if (_initialize_rear_skip(p, range))
1841 return _static_rear_skip(range,
item, equality);
1846 template<::comparison::equality<ITEM> EQUALITY>
1847 constexpr const_iterator _rear_skip(ARG_ITEM
item, EQUALITY equality)
const
1850 return _static_rear_skip(*
this,
item, equality);
1855 template<::comparison::equality<ITEM> EQUALITY>
1856 constexpr const_iterator rear_skip(ARG_ITEM
item, EQUALITY equality)
const
1859 return static_rear_skip(*
this,
item, equality);
1900 static constexpr bool _initialize_find_item(const_iterator & p,
const THIS_RAW_RANGE & range)
noexcept
1903 if (range.is_empty())
1954 static constexpr bool _initialize_rear_find(const_iterator & p,
const THIS_RAW_RANGE & range)
noexcept
1957 if (range.is_empty())
1971 template<::comparison::equality<ITEM> EQUALITY>
1972 static constexpr const_iterator
1973 _static_rear_find(THIS_RAW_RANGE range, ARG_ITEM
item, EQUALITY equality)
noexcept
1981 if (range.is_before_begin(range.end()))
1988 if (equality.equals(*range.end(),
item))
2003 template<::comparison::equality<ITEM> EQUALITY>
2004 static constexpr const_iterator
2005 static_rear_find(THIS_RAW_RANGE range, ARG_ITEM
item, EQUALITY equality)
noexcept
2010 if (_initialize_find_item(p, range))
2019 return _static_rear_find(range,
item, equality);
2024 template<::comparison::equality<ITEM> EQUALITY>
2025 constexpr const_iterator _rear_find(ARG_ITEM
item, EQUALITY equality)
const
2028 return _static_rear_find(*
this,
item, equality);
2033 template<::comparison::equality<ITEM> EQUALITY>
2034 constexpr const_iterator rear_find(ARG_ITEM
item, EQUALITY equality)
const
2037 return static_rear_find(*
this,
item, equality);
2155 static constexpr bool
2156 _initialize_contains(
bool & b,
const THIS_RAW_RANGE & range,
const THIS_RAW_RANGE & rangeBlock)
noexcept
2159 if (rangeBlock.is_empty())
2168 if (range.is_empty())
2182 template<::comparison::equality<ITEM> EQUALITY>
2183 static constexpr bool _static_begins(THIS_RAW_RANGE range, THIS_RAW_RANGE rangeBlock, EQUALITY equality)
noexcept
2189 if (!equality.equals(*range.begin(), *rangeBlock.begin()))
2198 rangeBlock.begin()++;
2200 }
while (!range.is_end(range.begin()) && !rangeBlock.is_end(rangeBlock.begin()));
2202 return rangeBlock.is_end(rangeBlock.begin());
2207 template<::comparison::equality<ITEM> EQUALITY>
2208 static constexpr bool
2209 static_begins(
const THIS_RAW_RANGE & range,
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
noexcept
2214 if (_initialize_contains(b, range, rangeBlock))
2221 return _static_begins(range, rangeBlock, equality);
2226 template<::comparison::equality<ITEM> EQUALITY>
2227 constexpr bool _begins(
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
const
2230 return _static_begins(*
this, rangeBlock, equality);
2235 template<::comparison::equality<ITEM> EQUALITY>
2236 constexpr bool begins(
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
const
2239 return static_begins(*
this, rangeBlock, equality);
2282 template<::comparison::equality<ITEM> EQUALITY>
2283 static constexpr bool _static_ends(THIS_RAW_RANGE range, THIS_RAW_RANGE rangeBlock, EQUALITY equality)
noexcept
2293 if (!equality.equals(*range.end(), *rangeBlock.end()))
2304 if (rangeBlock.is_before_begin(rangeBlock.end()))
2311 }
while (!range.is_before_begin(range.end()));
2318 template<::comparison::equality<ITEM> EQUALITY>
2319 static constexpr bool
2320 static_ends(
const THIS_RAW_RANGE & range,
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
noexcept
2325 if (_initialize_contains(b, range, rangeBlock))
2332 return _static_ends(range, rangeBlock, equality);
2337 template<::comparison::equality<ITEM> EQUALITY>
2338 constexpr bool _ends(
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
const
2341 return _static_ends(*
this, rangeBlock, equality);
2346 template<::comparison::equality<ITEM> EQUALITY>
2347 constexpr bool ends(
const THIS_RAW_RANGE & rangeBlock, EQUALITY equality)
const
2350 return static_ends(*
this, rangeBlock, equality);