Static Value-Flow Analysis
Loading...
Searching...
No Matches
SVF::iter_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT > Class Template Reference

#include <iterator.h>

Inheritance diagram for SVF::iter_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >:
SVF::iter_adaptor_base< mapped_iter< ItTy, FuncTy >, ItTy, std::iterator_traits< ItTy >::iterator_category, std::remove_reference< decltype(std::declval< FuncTy >()(*std::declval< ItTy >())) >::type > SVF::iter_adaptor_base< DerivedT, WrappedIteratorT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT > SVF::mapped_iter< typename SVF::GenericNode< NodeTy, EdgeTy >::iterator, decltype(&edge_dest)> SVF::mapped_iter< typename GenericGraphTy::iterator, decltype(&deref_val)> SVF::pointer_iterator< pointee_iter< WrappedIteratorT, T1 >, T2 > SVF::mapped_iter< ItTy, FuncTy, FuncReturnTy > SVF::pointee_iter< WrappedIteratorT, T > SVF::pointer_iterator< WrappedIteratorT, T >

Classes

class  ReferenceProxy

Public Types

using iterator_category = IteratorCategoryT
using value_type = T
using difference_type = DifferenceTypeT
using pointer = PointerT
using reference = ReferenceT

Public Member Functions

DerivedT operator+ (DifferenceTypeT n) const
DerivedT operator- (DifferenceTypeT n) const
DerivedT & operator++ ()
DerivedT operator++ (int)
DerivedT & operator-- ()
DerivedT operator-- (int)
bool operator!= (const DerivedT &RHS) const
bool operator> (const DerivedT &RHS) const
bool operator<= (const DerivedT &RHS) const
bool operator>= (const DerivedT &RHS) const
PointerT operator-> ()
PointerT operator-> () const
ReferenceProxy operator[] (DifferenceTypeT n)
ReferenceProxy operator[] (DifferenceTypeT n) const

Protected Types

enum  { IsRandomAccess , IsBidirectional }

Friends

DerivedT operator+ (DifferenceTypeT n, const DerivedT &i)

Detailed Description

template<typename DerivedT, typename IteratorCategoryT, typename T, typename DifferenceTypeT = std::ptrdiff_t, typename PointerT = T *, typename ReferenceT = T &>
class SVF::iter_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >

CRTP base class which implements the entire standard iterator facade in terms of a minimal subset of the interface.

Use this when it is reasonable to implement most of the iterator functionality in terms of a core subset. If you need special behavior or there are performance implications for this, you may want to override the relevant members instead.

Note, one abstraction that this does not provide is implementing subtraction in terms of addition by negating the difference. Negation isn't always information preserving, and I can see very reasonable iterator designs where this doesn't work well. It doesn't really force much added boilerplate anyways.

Another abstraction that this doesn't provide is implementing increment in terms of addition of one. These aren't equivalent for all iterator categories, and respecting that adds a lot of complexity for little gain.

Classes wishing to use iter_facade_base should implement the following methods:

Forward Iterators: (All of the following methods)

  • DerivedT &operator=(const DerivedT &R);
  • bool operator==(const DerivedT &R) const;
  • const T &operator*() const;
  • T &operator*();
  • DerivedT &operator++();

Bidirectional Iterators: (All methods of forward iterators, plus the following)

Random-access Iterators: (All methods of bidirectional iterators excluding the following)

  • DerivedT &operator++();
  • DerivedT &operator--(); (and plus the following)
  • bool operator<(const DerivedT &RHS) const;
  • DifferenceTypeT operator-(const DerivedT &R) const;
  • DerivedT &operator+=(DifferenceTypeT N);
  • DerivedT &operator-=(DifferenceTypeT N);

Definition at line 67 of file iterator.h.

Member Typedef Documentation

◆ difference_type

template<typename DerivedT, typename IteratorCategoryT, typename T, typename DifferenceTypeT = std::ptrdiff_t, typename PointerT = T *, typename ReferenceT = T &>
using SVF::iter_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::difference_type = DifferenceTypeT

Definition at line 72 of file iterator.h.

◆ iterator_category

template<typename DerivedT, typename IteratorCategoryT, typename T, typename DifferenceTypeT = std::ptrdiff_t, typename PointerT = T *, typename ReferenceT = T &>
using SVF::iter_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::iterator_category = IteratorCategoryT

Definition at line 70 of file iterator.h.

◆ pointer

template<typename DerivedT, typename IteratorCategoryT, typename T, typename DifferenceTypeT = std::ptrdiff_t, typename PointerT = T *, typename ReferenceT = T &>
using SVF::iter_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::pointer = PointerT

Definition at line 73 of file iterator.h.

◆ reference

template<typename DerivedT, typename IteratorCategoryT, typename T, typename DifferenceTypeT = std::ptrdiff_t, typename PointerT = T *, typename ReferenceT = T &>
using SVF::iter_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::reference = ReferenceT

Definition at line 74 of file iterator.h.

◆ value_type

template<typename DerivedT, typename IteratorCategoryT, typename T, typename DifferenceTypeT = std::ptrdiff_t, typename PointerT = T *, typename ReferenceT = T &>
using SVF::iter_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::value_type = T

Definition at line 71 of file iterator.h.

Member Enumeration Documentation

◆ anonymous enum

template<typename DerivedT, typename IteratorCategoryT, typename T, typename DifferenceTypeT = std::ptrdiff_t, typename PointerT = T *, typename ReferenceT = T &>
anonymous enum
protected

Member Function Documentation

◆ operator!=()

template<typename DerivedT, typename IteratorCategoryT, typename T, typename DifferenceTypeT = std::ptrdiff_t, typename PointerT = T *, typename ReferenceT = T &>
bool SVF::iter_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::operator!= ( const DerivedT & RHS) const
inline

Definition at line 164 of file iterator.h.

165 {
166 return !(static_cast<const DerivedT &>(*this) == RHS);
167 }

◆ operator+()

template<typename DerivedT, typename IteratorCategoryT, typename T, typename DifferenceTypeT = std::ptrdiff_t, typename PointerT = T *, typename ReferenceT = T &>
DerivedT SVF::iter_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::operator+ ( DifferenceTypeT n) const
inline

Definition at line 106 of file iterator.h.

107 {
109 "Must pass the derived type to this template!");
110 static_assert(
112 "The '+' operator is only defined for random access iterators.");
113 DerivedT tmp = *static_cast<const DerivedT *>(this);
114 tmp += n;
115 return tmp;
116 }

◆ operator++() [1/2]

template<typename DerivedT, typename IteratorCategoryT, typename T, typename DifferenceTypeT = std::ptrdiff_t, typename PointerT = T *, typename ReferenceT = T &>
DerivedT & SVF::iter_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::operator++ ( )
inline

Definition at line 134 of file iterator.h.

135 {
137 "Must pass the derived type to this template!");
138 return static_cast<DerivedT *>(this)->operator+=(1);
139 }

◆ operator++() [2/2]

template<typename DerivedT, typename IteratorCategoryT, typename T, typename DifferenceTypeT = std::ptrdiff_t, typename PointerT = T *, typename ReferenceT = T &>
DerivedT SVF::iter_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::operator++ ( int )
inline

Definition at line 140 of file iterator.h.

141 {
142 DerivedT tmp = *static_cast<DerivedT *>(this);
143 ++*static_cast<DerivedT *>(this);
144 return tmp;
145 }

◆ operator-()

template<typename DerivedT, typename IteratorCategoryT, typename T, typename DifferenceTypeT = std::ptrdiff_t, typename PointerT = T *, typename ReferenceT = T &>
DerivedT SVF::iter_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::operator- ( DifferenceTypeT n) const
inline

Definition at line 124 of file iterator.h.

125 {
126 static_assert(
128 "The '-' operator is only defined for random access iterators.");
129 DerivedT tmp = *static_cast<const DerivedT *>(this);
130 tmp -= n;
131 return tmp;
132 }

◆ operator--() [1/2]

template<typename DerivedT, typename IteratorCategoryT, typename T, typename DifferenceTypeT = std::ptrdiff_t, typename PointerT = T *, typename ReferenceT = T &>
DerivedT & SVF::iter_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::operator-- ( )
inline

Definition at line 146 of file iterator.h.

147 {
148 static_assert(
150 "The decrement operator is only defined for bidirectional iterators.");
151 return static_cast<DerivedT *>(this)->operator-=(1);
152 }

◆ operator--() [2/2]

template<typename DerivedT, typename IteratorCategoryT, typename T, typename DifferenceTypeT = std::ptrdiff_t, typename PointerT = T *, typename ReferenceT = T &>
DerivedT SVF::iter_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::operator-- ( int )
inline

Definition at line 153 of file iterator.h.

154 {
155 static_assert(
157 "The decrement operator is only defined for bidirectional iterators.");
158 DerivedT tmp = *static_cast<DerivedT *>(this);
159 --*static_cast<DerivedT *>(this);
160 return tmp;
161 }

◆ operator->() [1/2]

template<typename DerivedT, typename IteratorCategoryT, typename T, typename DifferenceTypeT = std::ptrdiff_t, typename PointerT = T *, typename ReferenceT = T &>
PointerT SVF::iter_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::operator-> ( )
inline

Definition at line 193 of file iterator.h.

194 {
195 return &static_cast<DerivedT *>(this)->operator*();
196 }

◆ operator->() [2/2]

template<typename DerivedT, typename IteratorCategoryT, typename T, typename DifferenceTypeT = std::ptrdiff_t, typename PointerT = T *, typename ReferenceT = T &>
PointerT SVF::iter_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::operator-> ( ) const
inline

Definition at line 197 of file iterator.h.

198 {
199 return &static_cast<const DerivedT *>(this)->operator*();
200 }

◆ operator<=()

template<typename DerivedT, typename IteratorCategoryT, typename T, typename DifferenceTypeT = std::ptrdiff_t, typename PointerT = T *, typename ReferenceT = T &>
bool SVF::iter_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::operator<= ( const DerivedT & RHS) const
inline

Definition at line 178 of file iterator.h.

179 {
180 static_assert(
182 "Relational operators are only defined for random access iterators.");
183 return !(static_cast<const DerivedT &>(*this) > RHS);
184 }

◆ operator>()

template<typename DerivedT, typename IteratorCategoryT, typename T, typename DifferenceTypeT = std::ptrdiff_t, typename PointerT = T *, typename ReferenceT = T &>
bool SVF::iter_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::operator> ( const DerivedT & RHS) const
inline

Definition at line 170 of file iterator.h.

171 {
172 static_assert(
174 "Relational operators are only defined for random access iterators.");
175 return !(static_cast<const DerivedT &>(*this) < RHS) &&
176 !(static_cast<const DerivedT &>(*this) == RHS);
177 }

◆ operator>=()

template<typename DerivedT, typename IteratorCategoryT, typename T, typename DifferenceTypeT = std::ptrdiff_t, typename PointerT = T *, typename ReferenceT = T &>
bool SVF::iter_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::operator>= ( const DerivedT & RHS) const
inline

Definition at line 185 of file iterator.h.

186 {
187 static_assert(
189 "Relational operators are only defined for random access iterators.");
190 return !(static_cast<const DerivedT &>(*this) < RHS);
191 }

◆ operator[]() [1/2]

template<typename DerivedT, typename IteratorCategoryT, typename T, typename DifferenceTypeT = std::ptrdiff_t, typename PointerT = T *, typename ReferenceT = T &>
ReferenceProxy SVF::iter_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::operator[] ( DifferenceTypeT n)
inline

Definition at line 201 of file iterator.h.

202 {
203 static_assert(IsRandomAccess,
204 "Subscripting is only defined for random access iterators.");
205 return ReferenceProxy(static_cast<DerivedT *>(this)->operator+(n));
206 }

◆ operator[]() [2/2]

template<typename DerivedT, typename IteratorCategoryT, typename T, typename DifferenceTypeT = std::ptrdiff_t, typename PointerT = T *, typename ReferenceT = T &>
ReferenceProxy SVF::iter_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::operator[] ( DifferenceTypeT n) const
inline

Definition at line 207 of file iterator.h.

208 {
209 static_assert(IsRandomAccess,
210 "Subscripting is only defined for random access iterators.");
211 return ReferenceProxy(static_cast<const DerivedT *>(this)->operator+(n));
212 }

◆ operator+

template<typename DerivedT, typename IteratorCategoryT, typename T, typename DifferenceTypeT = std::ptrdiff_t, typename PointerT = T *, typename ReferenceT = T &>
DerivedT operator+ ( DifferenceTypeT n,
const DerivedT & i )
friend

Definition at line 117 of file iterator.h.

118 {
119 static_assert(
121 "The '+' operator is only defined for random access iterators.");
122 return i + n;
123 }

The documentation for this class was generated from the following file: