48 template <
typename,
typename,
typename,
typename>
51 template <
typename T,
typename ContainerIterator,
typename AbstractIterator = i_const_iterator<abstract_t<T>>>
62 using typename base_type::difference_type;
63 using typename base_type::pointer;
64 using typename base_type::reference;
65 using typename base_type::abstract_iterator;
66 using typename base_type::abstract_const_iterator;
67 using typename base_type::abstract_base_iterator;
68 using typename base_type::abstract_base_const_iterator;
73 template <
typename ContainerIterator2,
typename AbstractIterator2>
75 template <
typename ContainerIterator2,
typename ContainerConstIterator,
typename AbstractIterator2>
79 template <
typename ContainerIterator2,
typename ContainerConstIterator,
typename AbstractIterator2>
87 pointer
operator->()
const override {
return &(**this); }
93 abstract_iterator* do_post_increment(
void* memory)
override {
if constexpr (!std::is_abstract_v<self_type>)
return new (memory) self_type{
iContainerIterator++ };
else throw pure_iterator(); }
94 abstract_iterator* do_post_decrement(
void* memory)
override {
if constexpr (!std::is_abstract_v<self_type>)
return new (memory) self_type{
iContainerIterator-- };
else throw pure_iterator(); }
99 template <
typename,
typename,
typename>
102 template <
typename T,
typename ContainerIterator>
112 using typename base_type::difference_type;
113 using typename base_type::pointer;
114 using typename base_type::reference;
115 using typename base_type::abstract_iterator;
116 using typename base_type::abstract_const_iterator;
117 using typename base_type::abstract_base_iterator;
118 using typename base_type::abstract_base_const_iterator;
119 using typename base_type::abstract_random_access_iterator;
120 using typename base_type::abstract_random_access_const_iterator;
125 template <
typename ContainerIterator2>
127 template <
typename ContainerIterator2,
typename ContainerConstIterator>
131 template <
typename ContainerIterator2,
typename ContainerConstIterator>
140 bool operator<(
const abstract_random_access_iterator& aOther)
const override {
return base_type::iContainerIterator < static_cast<const self_type&>(aOther).base_type::iContainerIterator; }
141 bool operator<=(
const abstract_random_access_iterator& aOther)
const override {
return base_type::iContainerIterator <= static_cast<const self_type&>(aOther).base_type::iContainerIterator; }
149 abstract_random_access_iterator* do_add(
void* memory, difference_type aDifference)
const override {
return new (memory) self_type{
base_type::iContainerIterator + aDifference }; }
150 abstract_random_access_iterator* do_subtract(
void* memory, difference_type aDifference)
const override {
return new (memory) self_type{
base_type::iContainerIterator - aDifference }; }
153 template <
typename T,
typename ContainerIterator,
typename ContainerConstIterator,
typename AbstractIterator = i_iterator<abstract_t<T>>>
158 template <
typename,
typename,
typename>
166 using typename base_type::difference_type;
167 using typename base_type::pointer;
168 using typename base_type::reference;
169 using typename base_type::abstract_iterator;
170 using typename base_type::abstract_const_iterator;
171 using typename base_type::abstract_base_iterator;
172 using typename base_type::abstract_base_const_iterator;
191 abstract_iterator* do_post_increment(
void* memory)
override {
if constexpr (!std::is_abstract_v<self_type>)
return new (memory) self_type{
iContainerIterator++ };
else throw pure_iterator(); }
192 abstract_iterator* do_post_decrement(
void* memory)
override {
if constexpr (!std::is_abstract_v<self_type>)
return new (memory) self_type{
iContainerIterator-- };
else throw pure_iterator(); }
197 template <
typename T,
typename ContainerIterator,
typename ContainerConstIterator>
202 template <
typename,
typename>
210 using typename base_type::difference_type;
211 using typename base_type::pointer;
212 using typename base_type::reference;
213 using typename base_type::abstract_iterator;
214 using typename base_type::abstract_const_iterator;
215 using typename base_type::abstract_base_iterator;
216 using typename base_type::abstract_base_const_iterator;
217 using typename base_type::abstract_random_access_iterator;
218 using typename base_type::abstract_random_access_const_iterator;
229 bool operator<(
const abstract_random_access_iterator& aOther)
const override {
return base_type::iContainerIterator < static_cast<const self_type&>(aOther).base_type::iContainerIterator; }
230 bool operator<=(
const abstract_random_access_iterator& aOther)
const override {
return base_type::iContainerIterator <= static_cast<const self_type&>(aOther).base_type::iContainerIterator; }
237 abstract_random_access_iterator* do_add(
void* memory, difference_type aDifference)
const override {
return new (memory) self_type{
base_type::iContainerIterator + aDifference }; }
238 abstract_random_access_iterator* do_subtract(
void* memory, difference_type aDifference)
const override {
return new (memory) self_type{
base_type::iContainerIterator - aDifference }; }
const abstract_t< T > abstract_value_type
bool operator==(const abstract_base_iterator &aOther) const override
const_iterator(const iterator< T, ContainerIterator2, ContainerConstIterator, AbstractIterator2 > &aOther)
const_iterator(container_iterator aContainerIterator)
ContainerIterator container_iterator
bool operator!=(const abstract_base_iterator &aOther) const override
pointer operator->() const override
AbstractIterator abstract_type
const_iterator & operator=(const self_type &aOther)
abstract_iterator & operator++() override
abstract_iterator & operator--() override
container_iterator iContainerIterator
const_iterator(const self_type &aOther)
const_iterator(const const_iterator< T, ContainerIterator2, AbstractIterator2 > &aOther)
abstract_iterator * clone(void *memory) const override
reference operator*() const override
const_iterator & operator=(const iterator< T, ContainerIterator2, ContainerConstIterator, AbstractIterator2 > &aOther)
bool operator==(const abstract_base_iterator &aOther) const override
abstract_iterator & operator++() override
abstract_t< T > abstract_value_type
bool operator!=(const abstract_base_iterator &aOther) const override
iterator(container_iterator aContainerIterator)
abstract_iterator * clone(void *memory) const override
container_iterator iContainerIterator
abstract_iterator & operator--() override
ContainerIterator container_iterator
iterator & operator=(const iterator &aOther)
pointer operator->() const override
abstract_const_iterator * const_clone(void *memory) const override
ContainerConstIterator container_const_iterator
AbstractIterator abstract_type
reference operator*() const override
iterator(const iterator &aOther)
abstract_iterator & operator+=(difference_type aDifference) override
random_access_const_iterator()
difference_type operator-(const abstract_random_access_iterator &aOther) const override
abstract_iterator & operator-=(difference_type aDifference) override
bool operator>=(const abstract_random_access_iterator &aOther) const override
bool operator<=(const abstract_random_access_iterator &aOther) const override
bool operator<(const abstract_random_access_iterator &aOther) const override
random_access_const_iterator(container_iterator aContainerIterator)
random_access_const_iterator(const random_access_iterator< T, ContainerIterator2, ContainerConstIterator > &aOther)
reference operator[](difference_type aDifference) const override
random_access_const_iterator(const random_access_const_iterator< T, ContainerIterator2 > &aOther)
random_access_const_iterator & operator=(const self_type &aOther)
bool operator>(const abstract_random_access_iterator &aOther) const override
random_access_const_iterator(const self_type &aOther)
random_access_const_iterator & operator=(const random_access_iterator< T, ContainerIterator2, ContainerConstIterator > &aOther)
abstract_iterator * clone(void *memory) const override
bool operator>(const abstract_random_access_iterator &aOther) const override
difference_type operator-(const abstract_random_access_iterator &aOther) const override
bool operator<=(const abstract_random_access_iterator &aOther) const override
abstract_iterator & operator+=(difference_type aDifference) override
abstract_iterator & operator-=(difference_type aDifference) override
random_access_iterator(container_iterator aContainerIterator)
abstract_random_access_const_iterator * const_clone(void *memory) const override
random_access_iterator & operator=(const random_access_iterator &aOther)
reference operator[](difference_type aDifference) const override
random_access_iterator(const random_access_iterator &aOther)
bool operator<(const abstract_random_access_iterator &aOther) const override
bool operator>=(const abstract_random_access_iterator &aOther) const override
abstract_random_access_iterator * clone(void *memory) const override
typename detail::abstract_type< T >::type abstract_t
const abstract_t< T > & to_abstract(const T &aArgument)