7#include <system/diagnostics/debug.h>
12#include <system/exceptions.h>
13#include <system/smart_ptr.h>
16namespace System {
namespace Collections {
namespace Generic {
18template <
typename T>
class IEnumerable;
22namespace System {
namespace Details {
27template <
typename Element>
28class VirtualizedIteratorBase
32 virtual ~VirtualizedIteratorBase() =
default;
36 virtual Element OffsetDereferenceIterator(std::ptrdiff_t offset)
const
38 ASPOSE_UNUSED(offset);
39 throw System::NotImplementedException(u
"Iterator offset dereference");
44 virtual void OffsetDereferenceAssignIterator(std::ptrdiff_t offset,
const Element &value)
const
46 ASPOSE_UNUSED(offset);
48 throw System::NotImplementedException(u
"Iterator offset assignment");
53 virtual void OffsetDereferenceAssignIterator(std::ptrdiff_t offset, Element &&value)
const
55 ASPOSE_UNUSED(offset);
57 throw System::NotImplementedException(u
"Iterator offset assignment");
61 virtual void IncrementIterator() = 0;
64 virtual void DecrementIterator()
66 throw System::NotImplementedException(u
"Iterator decrement");
71 virtual void ShiftIteratorBy(std::ptrdiff_t offset)
73 ASPOSE_UNUSED(offset);
74 throw System::NotImplementedException(u
"Iterator offset shift");
79 virtual bool IteratorEquals(VirtualizedIteratorBase *other)
const = 0;
83 virtual bool IteratorLess(VirtualizedIteratorBase *other)
const
86 throw System::NotImplementedException(u
"Iterator less-comparison");
91 virtual std::ptrdiff_t DiffIterators(VirtualizedIteratorBase *other)
const
94 throw System::NotImplementedException(u
"Iterator subtraction");
98 virtual VirtualizedIteratorBase* CloneIterator()
const = 0;
102 bool AssignsContainerValue()
const
104 return m_points_to_container_element;
108 bool IsEndIterator()
const
114 Element* GetElementPointer()
const
119 VirtualizedIteratorBase(
const VirtualizedIteratorBase&) =
delete;
120 VirtualizedIteratorBase(VirtualizedIteratorBase&&) =
delete;
121 VirtualizedIteratorBase& operator = (
const VirtualizedIteratorBase&) =
delete;
122 VirtualizedIteratorBase& operator = (VirtualizedIteratorBase&&) =
delete;
128 VirtualizedIteratorBase(
bool points_to_container_element,
bool is_end_iterator)
129 : m_points_to_container_element(points_to_container_element)
130 , m_is_end(is_end_iterator)
134 const bool m_points_to_container_element;
145template <
typename Iterator>
146struct UnderlyingIteratorExtractor
149 using type = Iterator;
154template <
typename Iterator>
155struct UnderlyingIteratorExtractor<std::reverse_iterator<Iterator>>
158 using type = Iterator;
162template <
typename Iterator>
163using UnderlyingIteratorType =
typename UnderlyingIteratorExtractor<typename std::remove_cv<typename std::remove_reference<Iterator>::type>::type>::type;
170template <
typename Iterator,
typename Value,
typename =
void>
171struct IteratorOffsetDereferencer
175 static Value get(
const Iterator&, std::ptrdiff_t)
177 throw System::NotSupportedException(u
"Iterator offset dereference");
184template <
typename Iterator,
typename Value>
185struct IteratorOffsetDereferencer<Iterator, Value, decltype(std::declval<const UnderlyingIteratorType<Iterator>>()[std::declval<std::ptrdiff_t>()], (void)0)>
191 static Value get(
const Iterator &iterator, std::ptrdiff_t offset)
193 return iterator[offset];
201template <
typename Iterator,
typename Value,
typename =
void>
202struct IteratorOffsetAssigner
206 static void assign(
const Iterator&, std::ptrdiff_t,
const Value&)
208 throw System::NotSupportedException(u
"Iterator offset assignment");
215template <
typename Iterator,
typename Value>
216struct IteratorOffsetAssigner<Iterator, Value, decltype((void)(std::declval<const UnderlyingIteratorType<Iterator>>()[std::declval<std::ptrdiff_t>()] = std::declval<Value>()))>
222 static void assign(
const Iterator &iterator, std::ptrdiff_t offset,
const Value &value)
224 iterator[offset] = value;
230 static void assign(
const Iterator &iterator, std::ptrdiff_t offset, Value &&value)
232 iterator[offset] = std::move(value);
239template <
typename Iterator,
typename =
void>
240struct IteratorDecrementer
244 static void decrement(Iterator&)
246 throw System::NotSupportedException(u
"Iterator decrement");
252template <
typename Iterator>
253struct IteratorDecrementer<Iterator, decltype(--std::declval<UnderlyingIteratorType<Iterator>>(), (void)0)>
257 static void decrement(Iterator &iterator)
266template <
typename Iterator,
typename =
void>
267struct IteratorShifter
271 static void shift(Iterator&, std::ptrdiff_t)
273 throw System::NotSupportedException(u
"Iterator decrement");
279template <
typename Iterator>
280struct IteratorShifter<Iterator, decltype(std::declval<UnderlyingIteratorType<Iterator>>() += std::declval<std::ptrdiff_t>(), (void)0)>
285 static void shift(Iterator &iterator, std::ptrdiff_t offset)
294template <
typename Iterator,
typename =
void>
299 static std::ptrdiff_t diff(
const Iterator&,
const Iterator&)
301 throw System::NotSupportedException(u
"Iterator difference");
307template <
typename Iterator>
308struct IteratorDiffer<Iterator, decltype(std::declval<UnderlyingIteratorType<Iterator>>() - std::declval<UnderlyingIteratorType<Iterator>>(), (void)0)>
314 static std::ptrdiff_t diff(
const Iterator &lhs,
const Iterator &rhs)
323template <
typename Iterator,
typename =
void>
324struct IteratorLessComparer
328 static bool less(
const Iterator&,
const Iterator&)
330 throw System::NotSupportedException(u
"Iterator less-comparison");
336template <
typename Iterator>
337struct IteratorLessComparer<Iterator, decltype(std::declval<UnderlyingIteratorType<Iterator>>() < std::declval<UnderlyingIteratorType<Iterator>>(), (void)0)>
343 static bool less(
const Iterator &lhs,
const Iterator &rhs)
354template <
typename Element,
bool iterator_provides_direct_reference,
356struct IteratorPointerUpdater
359 void InitializeIteratorPointer(Element*&)
365 void UpdateIteratorPointer(Element *&pointer, Element &value)
373 void UpdateIteratorPointer(Element *&pointer,
const Element &value)
377 pointer =
const_cast<Element*
>(&value);
385template <
typename Element>
386struct IteratorPointerUpdater<
Element, false, true>
390 void InitializeIteratorPointer(Element *&pointer)
397 void UpdateIteratorPointer(Element*&,
const Element &value)
404 void UpdateIteratorPointer(Element*&, Element &&value)
406 m_cache = std::move(value);
413 Element* HoldTemporaryObject(Element &&value)
415 m_cache = std::move(value);
422 Element* HoldTemporaryObject(
const Element &value)
431 Element* HoldIfTemporary(Element &&value)
433 m_cache = std::move(value);
440 Element* HoldIfTemporary(
const Element &value)
448 Element* HoldIfTemporary(Element &value)
457 const Element& HoldAndGetReference(Element &&value)
const
459 m_cache = std::move(value);
466 const Element& HoldAndGetReference(
const Element &value)
const
475 const Element& HoldIfTemporaryAndGetReference(Element &&value)
const
477 m_cache = std::move(value);
484 const Element& HoldIfTemporaryAndGetReference(
const Element &value)
const
498template <
typename Element>
499struct IteratorPointerUpdater<
Element, false, false>
502 IteratorPointerUpdater() =
default;
504 IteratorPointerUpdater(
const IteratorPointerUpdater &)
508 ~IteratorPointerUpdater()
515 void InitializeIteratorPointer(Element *&pointer)
517 pointer =
reinterpret_cast<Element*
>(&m_cache);
522 void UpdateIteratorPointer(Element*&,
const Element &value)
531 reinterpret_cast<Element&
>(m_cache) = value;
537 void UpdateIteratorPointer(Element*&, Element &&value)
541 new (
reinterpret_cast<Element*
>(&m_cache))
Element(std::move(value));
546 reinterpret_cast<Element&
>(m_cache) = std::move(value);
554 Element* HoldTemporaryObject(Element &&value)
558 new (
reinterpret_cast<Element*
>(&m_cache))
Element(std::move(value));
563 reinterpret_cast<Element&
>(m_cache) = std::move(value);
565 return reinterpret_cast<Element*
>(&m_cache);
571 Element* HoldTemporaryObject(
const Element &value)
580 reinterpret_cast<Element&
>(m_cache) = value;
582 return reinterpret_cast<Element*
>(&m_cache);
588 Element* HoldIfTemporary(Element &&value)
592 new (
reinterpret_cast<Element*
>(&m_cache))
Element(std::move(value));
597 reinterpret_cast<Element&
>(m_cache) = std::move(value);
599 return reinterpret_cast<Element*
>(&m_cache);
605 Element* HoldIfTemporary(
const Element &value)
614 reinterpret_cast<Element&
>(m_cache) = value;
616 return reinterpret_cast<Element*
>(&m_cache);
621 Element* HoldIfTemporary(Element &value)
630 const Element& HoldAndGetReference(Element &&value)
const
634 new (
reinterpret_cast<Element*
>(&m_cache))
Element(std::move(value));
639 reinterpret_cast<Element&
>(m_cache) = std::move(value);
641 return *
reinterpret_cast<Element*
>(&m_cache);
647 const Element& HoldAndGetReference(
const Element &value)
const
656 reinterpret_cast<Element&
>(m_cache) = value;
658 return *
reinterpret_cast<Element*
>(&m_cache);
664 const Element& HoldIfTemporaryAndGetReference(Element &&value)
const
668 new (
reinterpret_cast<Element*
>(&m_cache))
Element(std::move(value));
673 reinterpret_cast<Element&
>(m_cache) = std::move(value);
675 return *
reinterpret_cast<Element*
>(&m_cache);
681 const Element& HoldIfTemporaryAndGetReference(
const Element &value)
const
688 mutable bool m_allocated =
false;
690 mutable typename std::aligned_storage<
sizeof(
Element),
alignof(Element)>::type m_cache;
698template <
typename Element,
typename Iterator>
699class NativeIteratorWrapperBase :
public VirtualizedIteratorBase<Element>
702 static constexpr bool is_pointer_assignable = std::is_same<decltype(*std::declval<Iterator>()), Element&>::value;
708 NativeIteratorWrapperBase(
const Iterator &iterator,
const Iterator &end)
709 : VirtualizedIteratorBase<
Element>(is_pointer_assignable, iterator == end)
710 , m_iterator(iterator)
716 NativeIteratorWrapperBase(Iterator &&iterator, Iterator &&end) noexcept
717 : VirtualizedIteratorBase<Element>(is_pointer_assignable, iterator == end)
718 , m_iterator(std::forward<Iterator>(iterator))
719 , m_end(std::forward<Iterator>(end))
722 virtual ~NativeIteratorWrapperBase() =
default;
724 bool IteratorEquals(VirtualizedIteratorBase<Element> *other)
const override
726 CODEPORTING_DEBUG_ASSERT(
dynamic_cast<NativeIteratorWrapperBase*
>(other) !=
nullptr);
727 return m_iterator ==
static_cast<NativeIteratorWrapperBase*
>(other)->m_iterator;
730 bool IteratorLess(VirtualizedIteratorBase<Element> *other)
const override
732 CODEPORTING_DEBUG_ASSERT(
dynamic_cast<NativeIteratorWrapperBase*
>(other) !=
nullptr);
733 return IteratorLessComparer<Iterator>::less(m_iterator,
static_cast<NativeIteratorWrapperBase*
>(other)->m_iterator);
736 std::ptrdiff_t DiffIterators(VirtualizedIteratorBase<Element> *other)
const override
738 CODEPORTING_DEBUG_ASSERT(
dynamic_cast<NativeIteratorWrapperBase*
>(other) !=
nullptr);
739 return IteratorDiffer<Iterator>::diff(m_iterator,
static_cast<NativeIteratorWrapperBase*
>(other)->m_iterator);
742 NativeIteratorWrapperBase(
const NativeIteratorWrapperBase&) =
delete;
743 NativeIteratorWrapperBase(NativeIteratorWrapperBase&&) =
delete;
749 const Iterator m_end;
753 bool IteratorIncrementImplementation()
756 VirtualizedIteratorBase<Element>::m_is_end = m_iterator == m_end;
757 if (VirtualizedIteratorBase<Element>::m_is_end)
758 VirtualizedIteratorBase<Element>::m_pointer =
nullptr;
759 return !VirtualizedIteratorBase<Element>::m_is_end;
764 bool IteratorShiftImplementation(std::ptrdiff_t offset)
766 IteratorShifter<Iterator>::shift(m_iterator, offset);
767 VirtualizedIteratorBase<Element>::m_is_end = m_iterator == m_end;
768 if (VirtualizedIteratorBase<Element>::m_is_end)
769 VirtualizedIteratorBase<Element>::m_pointer =
nullptr;
770 return !VirtualizedIteratorBase<Element>::m_is_end;
778template <
typename Element,
typename Iterator>
779class NativeIteratorWrapper
780 :
public NativeIteratorWrapperBase<Element, Iterator>
781 ,
private IteratorPointerUpdater<Element, std::is_same<Element&, decltype(*std::declval<Iterator>())>::value>
784 using NativeIteratorWrapperBase<
Element, Iterator>::m_iterator;
785 using NativeIteratorWrapperBase<
Element, Iterator>::m_end;
786 using VirtualizedIteratorBase<
Element>::m_pointer;
787 using IteratorPointerUpdater<
Element, std::is_same<Element&, decltype(*std::declval<Iterator>())>::value>::InitializeIteratorPointer;
788 using IteratorPointerUpdater<
Element, std::is_same<Element&, decltype(*std::declval<Iterator>())>::value>::UpdateIteratorPointer;
794 NativeIteratorWrapper(
const Iterator &iterator,
const Iterator &end)
795 : NativeIteratorWrapperBase<
Element, Iterator>(iterator, end)
797 InitializeIteratorPointer(m_pointer);
798 if (!VirtualizedIteratorBase<Element>::IsEndIterator())
799 UpdateIteratorPointer(m_pointer, *m_iterator);
804 NativeIteratorWrapper(Iterator &&iterator, Iterator &&end) noexcept
805 : NativeIteratorWrapperBase<Element, Iterator>(std::forward<Iterator>(iterator), std::forward<Iterator>(end))
807 InitializeIteratorPointer(m_pointer);
808 if (!VirtualizedIteratorBase<Element>::IsEndIterator())
809 UpdateIteratorPointer(m_pointer, *m_iterator);
812 virtual ~NativeIteratorWrapper() =
default;
814 void IncrementIterator()
override
816 if (NativeIteratorWrapperBase<Element, Iterator>::IteratorIncrementImplementation())
817 UpdateIteratorPointer(m_pointer, *m_iterator);
820 void DecrementIterator()
override
822 IteratorDecrementer<Iterator>::decrement(m_iterator);
823 VirtualizedIteratorBase<Element>::m_is_end =
false;
824 UpdateIteratorPointer(m_pointer, *m_iterator);
827 void ShiftIteratorBy(std::ptrdiff_t offset)
override
829 if (NativeIteratorWrapperBase<Element, Iterator>::IteratorShiftImplementation(offset))
830 UpdateIteratorPointer(m_pointer, *m_iterator);
833 Element OffsetDereferenceIterator(std::ptrdiff_t offset)
const override
835 return IteratorOffsetDereferencer<Iterator, Element>::get(m_iterator, offset);
838 void OffsetDereferenceAssignIterator(std::ptrdiff_t offset,
const Element &value)
const override
840 IteratorOffsetAssigner<Iterator, Element>::assign(m_iterator, offset, value);
843 void OffsetDereferenceAssignIterator(std::ptrdiff_t offset, Element &&value)
const override
845 IteratorOffsetAssigner<Iterator, Element>::assign(m_iterator, offset, std::move(value));
848 VirtualizedIteratorBase<Element>* CloneIterator()
const override
850 return new NativeIteratorWrapper(m_iterator, m_end);
853 NativeIteratorWrapper(NativeIteratorWrapper&&) =
delete;
858 NativeIteratorWrapper(
const NativeIteratorWrapper &other)
859 : NativeIteratorWrapper(other.m_iterator, other.VirtualizedIteratorBase<
Element>::m_end)
866template <
typename Element,
typename Iterator>
867class NativeConstIteratorWrapper
868 :
public NativeIteratorWrapperBase<Element, Iterator>
869 ,
private IteratorPointerUpdater<Element, std::is_same<Element&, decltype(*std::declval<Iterator>())>::value || std::is_same<const Element&, decltype(*std::declval<Iterator>())>::value>
872 using NativeIteratorWrapperBase<
Element, Iterator>::m_iterator;
873 using NativeIteratorWrapperBase<
Element, Iterator>::m_end;
874 using VirtualizedIteratorBase<
Element>::m_pointer;
875 using IteratorPointerUpdater<
Element, std::is_same<Element&, decltype(*std::declval<Iterator>())>::value || std::is_same<
const Element&,
decltype(*std::declval<Iterator>())>::value>
876 ::InitializeIteratorPointer;
877 using IteratorPointerUpdater<
Element, std::is_same<Element&, decltype(*std::declval<Iterator>())>::value || std::is_same<
const Element&,
decltype(*std::declval<Iterator>())>::value>
878 ::UpdateIteratorPointer;
884 NativeConstIteratorWrapper(
const Iterator &iterator,
const Iterator &end)
885 : NativeIteratorWrapperBase<
Element, Iterator>(iterator, end)
887 InitializeIteratorPointer(m_pointer);
888 if (!VirtualizedIteratorBase<Element>::IsEndIterator())
889 UpdateIteratorPointer(m_pointer, *m_iterator);
894 NativeConstIteratorWrapper(Iterator &&iterator, Iterator &&end) noexcept
895 : NativeIteratorWrapperBase<Element, Iterator>(std::forward<Iterator>(iterator), std::forward<Iterator>(end))
897 InitializeIteratorPointer(m_pointer);
898 if (!VirtualizedIteratorBase<Element>::IsEndIterator())
899 UpdateIteratorPointer(m_pointer, *m_iterator);
902 virtual ~NativeConstIteratorWrapper() =
default;
904 void IncrementIterator()
override
906 if (NativeIteratorWrapperBase<Element, Iterator>::IteratorIncrementImplementation())
907 UpdateIteratorPointer(m_pointer, *m_iterator);
910 void DecrementIterator()
override
912 IteratorDecrementer<Iterator>::decrement(m_iterator);
913 VirtualizedIteratorBase<Element>::m_is_end =
false;
914 UpdateIteratorPointer(m_pointer, *m_iterator);
917 void ShiftIteratorBy(std::ptrdiff_t offset)
override
919 if (NativeIteratorWrapperBase<Element, Iterator>::IteratorShiftImplementation(offset))
920 UpdateIteratorPointer(m_pointer, *m_iterator);
923 Element OffsetDereferenceIterator(std::ptrdiff_t offset)
const override
925 return IteratorOffsetDereferencer<Iterator, Element>::get(m_iterator, offset);
928 void OffsetDereferenceAssignIterator(std::ptrdiff_t,
const Element&)
const override
930 throw System::NotSupportedException(u
"Assigning element through const iterator");
933 void OffsetDereferenceAssignIterator(std::ptrdiff_t, Element&&)
const override
935 throw System::NotSupportedException(u
"Assigning element through const iterator");
938 VirtualizedIteratorBase<Element>* CloneIterator()
const override
940 return new NativeConstIteratorWrapper(m_iterator, m_end);
943 NativeConstIteratorWrapper(NativeConstIteratorWrapper&&) =
delete;
948 NativeConstIteratorWrapper(
const NativeConstIteratorWrapper& other)
949 : NativeConstIteratorWrapper(other.m_iterator, other.VirtualizedIteratorBase<
Element>::m_end)
956template <
typename Element>
957class EnumeratorBasedIterator :
public VirtualizedIteratorBase<Element>
961 virtual ~EnumeratorBasedIterator() =
default;
964 bool IteratorEquals(VirtualizedIteratorBase<Element> *other)
const override
966 CODEPORTING_DEBUG_ASSERT(
dynamic_cast<EnumeratorBasedIterator*
>(other) !=
nullptr);
967 return static_cast<EnumeratorBasedIterator*
>(other)->m_offset == m_offset;
970 bool IteratorLess(VirtualizedIteratorBase<Element> *other)
const override
972 CODEPORTING_DEBUG_ASSERT(
dynamic_cast<EnumeratorBasedIterator*
>(other) !=
nullptr);
973 return static_cast<EnumeratorBasedIterator*
>(other)->m_offset > m_offset;
976 virtual void InitializeIterator()
981 EnumeratorBasedIterator()
982 : VirtualizedIteratorBase<
Element>(false, true)
983 , m_offset(std::numeric_limits<std::ptrdiff_t>::max())
987 EnumeratorBasedIterator(std::ptrdiff_t offset)
988 : VirtualizedIteratorBase<
Element>(false, offset == std::numeric_limits<std::ptrdiff_t>::max())
992 EnumeratorBasedIterator(
const EnumeratorBasedIterator &other)
993 : VirtualizedIteratorBase<
Element>(false, other.m_offset == std::numeric_limits<std::ptrdiff_t>::max())
994 , m_offset(other.m_offset)
998 std::ptrdiff_t m_offset;
1003template <
typename Element>
1004class EnumeratorBasedEndIterator :
public EnumeratorBasedIterator<Element>
1008 EnumeratorBasedEndIterator()
1009 : EnumeratorBasedIterator<
Element>(std::numeric_limits<std::ptrdiff_t>::max())
1012 virtual ~EnumeratorBasedEndIterator() =
default;
1015 void IncrementIterator()
override
1017 throw InvalidOperationException(u
"Moving past the container's end");
1020 System::Details::VirtualizedIteratorBase<Element>* CloneIterator()
const override
1022 return new EnumeratorBasedEndIterator();
1030template <
typename Element>
1031class VirtualizedIteratorOffsetPointer
1037 VirtualizedIteratorOffsetPointer(VirtualizedIteratorBase<Element> *iterator, std::ptrdiff_t offset)
1038 : m_value(iterator->OffsetDereferenceIterator(offset))
1042 VirtualizedIteratorOffsetPointer(VirtualizedIteratorOffsetPointer &&other) noexcept
1043 : m_value(std::move(other.m_value))
1048 decltype(std::declval<Element>().operator ->())
operator -> ()
const
1050 return m_value.operator ->();
1053 VirtualizedIteratorOffsetPointer(
const VirtualizedIteratorOffsetPointer&) =
delete;
1054 VirtualizedIteratorOffsetPointer& operator = (
const VirtualizedIteratorOffsetPointer&) =
delete;
1055 VirtualizedIteratorOffsetPointer& operator = (VirtualizedIteratorOffsetPointer&&) =
delete;
1064template <
typename Element>
1065class VirtualizedIteratorOffsetReference
1071 VirtualizedIteratorOffsetReference(VirtualizedIteratorBase<Element> *iterator, std::ptrdiff_t offset)
1072 : m_iterator(iterator), m_offset(offset)
1075 VirtualizedIteratorOffsetReference(
const VirtualizedIteratorOffsetReference&) =
default;
1077 VirtualizedIteratorOffsetReference(VirtualizedIteratorOffsetReference&&) noexcept = default;
1081 operator Element ()
const
1084 return *m_iterator->GetElementPointer();
1086 return m_iterator->OffsetDereferenceIterator(m_offset);
1091 VirtualizedIteratorOffsetReference& operator = (
const Element &value)
1093 m_iterator->OffsetDereferenceAssignIterator(m_offset, value);
1099 VirtualizedIteratorOffsetReference& operator = (Element &&value)
1101 m_iterator->OffsetDereferenceAssignIterator(m_offset, std::move(value));
1106 VirtualizedIteratorOffsetPointer<Element> operator -> ()
const
1108 return VirtualizedIteratorOffsetPointer<Element>(m_iterator, m_offset);
1111 VirtualizedIteratorOffsetReference& operator = (
const VirtualizedIteratorOffsetReference&) =
delete;
1112 VirtualizedIteratorOffsetReference& operator = (VirtualizedIteratorOffsetReference&&) =
delete;
1116 VirtualizedIteratorBase<Element> *
const m_iterator;
1118 const std::ptrdiff_t m_offset;
1122template <
typename Element>
class VirtualizedConstIterator;
1158template <
typename Element>
1159class VirtualizedIterator :
public BaseIterator<std::random_access_iterator_tag, Element, std::ptrdiff_t, Element*, Element&>
1164 VirtualizedIterator() =
default;
1167 VirtualizedIterator(
const VirtualizedIterator &other)
1168 : m_iterator(other.m_iterator->CloneIterator())
1172 VirtualizedIterator(VirtualizedIterator &&other) noexcept
1173 : m_iterator(other.m_iterator.release())
1177 explicit VirtualizedIterator(VirtualizedIteratorBase<Element> *virtualizedIterator)
1178 : m_iterator(virtualizedIterator)
1183 VirtualizedIterator& operator = (
const VirtualizedIterator &other)
1185 m_iterator.reset(other.m_iterator->CloneIterator());
1190 VirtualizedIterator& operator = (VirtualizedIterator &&other)
noexcept
1192 m_iterator = std::move(other.m_iterator);
1198 VirtualizedIterator& operator ++ ()
1200 m_iterator->IncrementIterator();
1205 VirtualizedIterator& operator -- ()
1207 m_iterator->DecrementIterator();
1212 VirtualizedIterator operator ++ (
int)
1214 VirtualizedIterator copy(*
this);
1220 VirtualizedIterator operator -- (
int)
1222 VirtualizedIterator copy(*
this);
1230 VirtualizedIterator& operator += (std::ptrdiff_t offset)
1232 m_iterator->ShiftIteratorBy(offset);
1238 VirtualizedIterator& operator -= (std::ptrdiff_t offset)
1240 m_iterator->ShiftIteratorBy(-offset);
1246 VirtualizedIterator
operator + (std::ptrdiff_t offset)
const
1248 VirtualizedIterator copy(*
this);
1255 VirtualizedIterator
operator - (std::ptrdiff_t offset)
const
1257 VirtualizedIterator copy(*
this);
1264 std::ptrdiff_t
operator - (
const VirtualizedIterator &other)
const
1266 return m_iterator->DiffIterators(other.m_iterator.get());
1273 return *m_iterator->GetElementPointer();
1279 return m_iterator->GetElementPointer();
1284 VirtualizedIteratorOffsetReference<Element> operator [] (std::ptrdiff_t offset)
const
1286 return VirtualizedIteratorOffsetReference<Element>(m_iterator.get(), offset);
1292 bool operator == (
const VirtualizedIterator &other)
const
1294 if (m_iterator->IsEndIterator() != other.m_iterator->IsEndIterator())
1296 else if (m_iterator->IsEndIterator())
1299 return m_iterator->IteratorEquals(other.m_iterator.get());
1304 bool operator != (
const VirtualizedIterator &other)
const
1306 if (m_iterator->IsEndIterator() != other.m_iterator->IsEndIterator())
1308 else if (m_iterator->IsEndIterator())
1311 return !m_iterator->IteratorEquals(other.m_iterator.get());
1316 bool operator < (
const VirtualizedIterator &other)
const
1318 if (other.m_iterator->IsEndIterator())
1319 return !m_iterator->IsEndIterator();
1321 return m_iterator->IteratorLess(other.m_iterator.get());
1326 bool operator >= (
const VirtualizedIterator &other)
const
1328 return !(*
this < other);
1333 bool operator > (
const VirtualizedIterator &other)
const
1335 return other < *
this;
1340 bool operator <= (
const VirtualizedIterator &other)
const
1342 return !(other < *
this);
1347 void swap(VirtualizedIterator &other)
1349 std::swap(m_iterator, other.m_iterator);
1354 std::unique_ptr<VirtualizedIteratorBase<std::remove_const_t<Element>>> m_iterator;
1356 friend class VirtualizedConstIterator<
Element>;
1394template <
typename Element>
1395class VirtualizedConstIterator :
public BaseIterator<std::random_access_iterator_tag, Element, std::ptrdiff_t, const Element*, const Element&>
1400 VirtualizedConstIterator()
1401 : m_iterator(nullptr)
1405 VirtualizedConstIterator(
const VirtualizedConstIterator &other)
1406 : m_iterator(other.m_iterator->CloneIterator())
1410 VirtualizedConstIterator(VirtualizedConstIterator &&other) noexcept
1411 : m_iterator(other.m_iterator.release())
1415 VirtualizedConstIterator(
const VirtualizedIterator<Element> &other)
1416 : m_iterator(other.m_iterator->CloneIterator())
1420 VirtualizedConstIterator(VirtualizedIterator<Element> &&other) noexcept
1421 : m_iterator(other.m_iterator.release())
1425 explicit VirtualizedConstIterator(VirtualizedIteratorBase<Element> *virtualizedIterator)
1426 : m_iterator(virtualizedIterator)
1431 VirtualizedConstIterator& operator = (
const VirtualizedConstIterator &other)
1433 m_iterator.reset(other.m_iterator->CloneIterator());
1438 VirtualizedConstIterator& operator = (VirtualizedConstIterator &&other)
noexcept
1440 m_iterator = std::move(other.m_iterator);
1446 VirtualizedConstIterator& operator ++ ()
1448 m_iterator->IncrementIterator();
1453 VirtualizedConstIterator& operator -- ()
1455 m_iterator->DecrementIterator();
1460 VirtualizedConstIterator operator ++ (
int)
1462 VirtualizedConstIterator copy(*
this);
1468 VirtualizedConstIterator operator -- (
int)
1470 VirtualizedConstIterator copy(*
this);
1478 VirtualizedConstIterator& operator += (std::ptrdiff_t offset)
1480 m_iterator->ShiftIteratorBy(offset);
1486 VirtualizedConstIterator& operator -= (std::ptrdiff_t offset)
1488 m_iterator->ShiftIteratorBy(-offset);
1494 VirtualizedConstIterator
operator + (std::ptrdiff_t offset)
const
1496 VirtualizedConstIterator copy(*
this);
1503 VirtualizedConstIterator
operator - (std::ptrdiff_t offset)
const
1505 VirtualizedConstIterator copy(*
this);
1512 std::ptrdiff_t
operator - (
const VirtualizedConstIterator &other)
const
1514 return m_iterator->DiffIterators(other.m_iterator.get());
1521 return *m_iterator->GetElementPointer();
1525 const Element* operator -> ()
const
1527 return m_iterator->GetElementPointer();
1532 Element operator [] (std::ptrdiff_t offset)
const
1535 return *m_iterator->GetElementPointer();
1537 return m_iterator->OffsetDereferenceIterator(offset);
1543 bool operator == (
const VirtualizedConstIterator &other)
const
1545 if (m_iterator->IsEndIterator() != other.m_iterator->IsEndIterator())
1547 else if (m_iterator->IsEndIterator())
1550 return m_iterator->IteratorEquals(other.m_iterator.get());
1555 bool operator != (
const VirtualizedConstIterator &other)
const
1557 if (m_iterator->IsEndIterator() != other.m_iterator->IsEndIterator())
1559 else if (m_iterator->IsEndIterator())
1562 return !m_iterator->IteratorEquals(other.m_iterator.get());
1567 bool operator < (
const VirtualizedConstIterator &other)
const
1569 if (other.m_iterator->IsEndIterator())
1570 return !m_iterator->IsEndIterator();
1572 return m_iterator->IteratorLess(other.m_iterator.get());
1577 bool operator >= (
const VirtualizedConstIterator &other)
const
1579 return !(*
this < other);
1584 bool operator > (
const VirtualizedConstIterator &other)
const
1586 return other < *
this;
1591 bool operator <= (
const VirtualizedConstIterator &other)
const
1593 return !(other < *
this);
1598 void swap(VirtualizedConstIterator &other)
1600 std::swap(m_iterator, other.m_iterator);
1605 std::unique_ptr<VirtualizedIteratorBase<std::remove_const_t<Element>>> m_iterator;
1613template <
typename Element>
1614VirtualizedIterator<Element>
operator + (std::ptrdiff_t offset,
const VirtualizedIterator<Element> &iterator)
1616 return iterator + offset;
1623template <
typename Element>
1624VirtualizedConstIterator<Element>
operator + (std::ptrdiff_t offset,
const VirtualizedConstIterator<Element> &iterator)
1626 return iterator + offset;
1631using System::Details::operator +;
1640template <
typename Element>
1641void swap(System::Details::VirtualizedIterator<Element> &lhs, System::Details::VirtualizedIterator<Element> &rhs)
1649template <
typename Element>
1650void swap(System::Details::VirtualizedConstIterator<Element> &lhs, System::Details::VirtualizedConstIterator<Element> &rhs)
@ Element
This value is used for internal purposes and is not intended to be used directly from your code.
Definition: db_command.h:9
bool operator!=(ArraySegment< T > a, ArraySegment< T > b)
Definition: array_segment.h:157
Decimal operator+(const T &x, const Decimal &d)
Returns a new instance of Decimal class that represents a value that is a sum of the specified value ...
Definition: decimal.h:542
constexpr bool operator>(std::nullptr_t, DateTime)
Definition: date_time.h:714
Decimal operator*(const T &x, const Decimal &d)
Returns a new instance of Decimal class that represents a value that is a result of multiplication of...
Definition: decimal.h:556
auto operator-(DayOfWeek a, DayOfWeek b)
Calculates the number of days between two days of week.
Definition: day_of_week.h:25
constexpr bool operator<(std::nullptr_t, DateTime)
Definition: date_time.h:712
constexpr bool operator<=(std::nullptr_t, DateTime)
Definition: date_time.h:713
constexpr bool operator>=(std::nullptr_t, DateTime)
Definition: date_time.h:715
bool operator==(ArraySegment< T > a, ArraySegment< T > b)
Definition: array_segment.h:151
Tests if specific type is a specialization of specific template. If it is, inherits std::true_type,...
Definition: detail.h:80