LLVM: llvm::iterator_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT (original) (raw)

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

#include "[llvm/ADT/iterator.h](iterator%5F8h%5Fsource.html)"

Inherited by llvm::BasicBlock::phi_iterator_impl< const PHINode, BasicBlock::const_iterator >, , , llvm::SuccIterator< Instruction, BasicBlock >, llvm::SuccIterator< const Instruction, const BasicBlock >, llvm::SwitchInst::CaseIteratorImpl< CaseHandle >, llvm::SwitchInst::CaseIteratorImpl< ConstCaseHandle >, llvm::VPAllSuccessorsIterator< VPBlockBase * >, llvm::VPAllSuccessorsIterator< const VPBlockBase * >, llvm::concat_iterator< GlobalObject, iterator, global_iterator >, llvm::concat_iterator< const GlobalObject, const_iterator, const_global_iterator >, llvm::concat_iterator< GlobalValue, iterator, global_iterator, alias_iterator, ifunc_iterator >, llvm::concat_iterator< const GlobalValue, const_iterator, const_global_iterator, const_alias_iterator, const_ifunc_iterator >, llvm::detail::zip_common< zip_enumerator< Iters... >, EnumeratorTupleType< Iters... >, Iters... >, llvm::detail::zip_common< zip_first< Iters... >, ZipTupleType< Iters... >::type, Iters... >, llvm::detail::zip_common< zip_shortest< Iters... >, ZipTupleType< Iters... >::type, Iters... >, llvm::iterator_adaptor_base< IteratorImpl< ValueT, IteratorBase >, IteratorBase, std::bidirectional_iterator_tag, ValueT >, llvm::iterator_adaptor_base< const_child_iterator, const_child_iterator_base >, llvm::iterator_adaptor_base< const_toplevel_iterator, const_toplevel_iterator_base >, llvm::iterator_adaptor_base< WrappedSuccIterator, succ_iterator, std::iterator_traits< succ_iterator >::iterator_category, NodeRef, std::ptrdiff_t, NodeRef *, NodeRef >, llvm::iterator_adaptor_base< value_iterator, ListTy::iterator, std::forward_iterator_tag, DIEValue >, llvm::iterator_adaptor_base< const_value_iterator, ListTy::const_iterator, std::forward_iterator_tag, const DIEValue >, llvm::iterator_adaptor_base< AACallEdgeIterator, SetVector< Function * >::iterator >, llvm::iterator_adaptor_base< GUIDIterator, IndexIterator, std::forward_iterator_tag, GlobalValue::GUID >, llvm::iterator_adaptor_base< call_iterator, CallMapTy::iterator >, llvm::iterator_adaptor_base< ChildIteratorType, SmallVector< BoUpSLP::EdgeInfo, 1 >::iterator >, llvm::iterator_adaptor_base< ImutAVLValueIterator< ImmutableMap >, ImmutableMap::TreeTy::iterator, std::iterator_traits< ImmutableMap::TreeTy::iterator >::iterator_category, const ImmutableMap::value_type >, llvm::iterator_adaptor_base< ImutAVLValueIterator< ImmutableMapRef >, ImmutableMapRef::TreeTy::iterator, std::iterator_traits< ImmutableMapRef::TreeTy::iterator >::iterator_category, const ImmutableMapRef::value_type >, llvm::iterator_adaptor_base< ImutAVLValueIterator< T >, T::TreeTy::iterator, std::iterator_traits< T::TreeTy::iterator >::iterator_category, const T::value_type >, llvm::iterator_adaptor_base< call_iterator, VectorImplT::iterator, std::forward_iterator_tag >, llvm::iterator_adaptor_base< iterator, VectorImplT::iterator, std::forward_iterator_tag >, llvm::iterator_adaptor_base< MCRegUnitIterator, MCRegisterInfo::DiffListIterator, std::forward_iterator_tag, const MCRegUnit >, llvm::iterator_adaptor_base< MCSubRegIterator, MCRegisterInfo::DiffListIterator, std::forward_iterator_tag, const MCPhysReg >, llvm::iterator_adaptor_base< MCSuperRegIterator, MCRegisterInfo::DiffListIterator, std::forward_iterator_tag, const MCPhysReg >, llvm::iterator_adaptor_base< early_inc_iterator_impl< WrappedIteratorT >, WrappedIteratorT, std::input_iterator_tag >, llvm::iterator_adaptor_base< filter_iterator_base< WrappedIteratorT, PredicateT, IterTag >, WrappedIteratorT, std::common_type_t< IterTag, std::iterator_traits< WrappedIteratorT >::iterator_category > >, llvm::iterator_adaptor_base< filter_iterator_base< WrappedIteratorT, PredicateT, std::forward_iterator_tag >, WrappedIteratorT, std::common_type_t< std::forward_iterator_tag, std::iterator_traits< WrappedIteratorT >::iterator_category > >, llvm::iterator_adaptor_base< filter_iterator_base< WrappedIteratorT, PredicateT, std::bidirectional_iterator_tag >, WrappedIteratorT, std::common_type_t< std::bidirectional_iterator_tag, std::iterator_traits< WrappedIteratorT >::iterator_category > >, llvm::iterator_adaptor_base< NeighborEdgeIteratorT< IsConst, IsOut >, typename NeighborSetT::const_iterator, std::iterator_traits< typename NeighborSetT::const_iterator >::iterator_category, std::conditional_t< IsConst, const EdgeValueType, EdgeValueType > >, llvm::jitlink::LinkGraph::nested_collection_iterator< section_iterator, Section::symbol_iterator, Symbol *, getSectionSymbols >, llvm::jitlink::LinkGraph::nested_collection_iterator< const_section_iterator, Section::const_symbol_iterator, const Symbol *, getSectionConstSymbols >, llvm::jitlink::LinkGraph::nested_collection_iterator< section_iterator, Section::block_iterator, Block *, getSectionBlocks >, llvm::jitlink::LinkGraph::nested_collection_iterator< const_section_iterator, Section::const_block_iterator, const Block *, getSectionConstBlocks >, llvm::memoryaccess_def_iterator_base< MemoryAccess >, llvm::memoryaccess_def_iterator_base< const MemoryAccess >, llvm::sandboxir::SwitchInst::CaseItImpl< llvm::SwitchInst::CaseIt, BasicBlock, ConstantInt >, llvm::sandboxir::SwitchInst::CaseItImpl< llvm::SwitchInst::ConstCaseIt, const BasicBlock, const ConstantInt >, and llvm::detail::zip_common< ZipType, ReferenceTupleType, Iters >.

Classes
class PointerProxy
A proxy object for computing a pointer via indirecting a copy of a reference. More...
class ReferenceProxy
A proxy object for computing a reference via indirecting a copy of an iterator. More...
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
PointerProxy operator-> () const
ReferenceProxy operator[] (DifferenceTypeT n) const
Protected Types
enum { IsRandomAccess, IsBidirectional }
Friends
DerivedT operator+ (DifferenceTypeT n, const DerivedT &i)

template<typename DerivedT, typename IteratorCategoryT, typename T, typename DifferenceTypeT = std::ptrdiff_t, typename PointerT = T *, typename ReferenceT = T &>
class llvm::iterator_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.

Iterators are expected to have const rules analogous to pointers, with a single, const-qualified operator*() that returns ReferenceT. This matches the second and third pointers in the following example:

{ int *I = &Value; }

{ int *const I = &Value; }

{ const int *I = &Value; }

{ const int *const I = &Value; }

LLVM Value Representation.

FunctionAddr VTableAddr Value

If an iterator facade returns a handle to its own state, then T (and PointerT and ReferenceT) should usually be const-qualified. Otherwise, if clients are expected to modify the handle itself, the field can be declared mutable or use const_cast.

Classes wishing to use iterator_facade_base should implement the following methods:

Forward Iterators: (All of the following methods)

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

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

Definition at line 80 of file iterator.h.

difference_type

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

using llvm::iterator_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::difference_type = DifferenceTypeT

iterator_category

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

using llvm::iterator_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::iterator_category = IteratorCategoryT

pointer

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

reference

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

value_type

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

anonymous enum

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

Enumerator
IsRandomAccess
IsBidirectional

Definition at line 89 of file iterator.h.

operator!=()

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

operator+()

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

DerivedT llvm::iterator_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::operator+ ( DifferenceTypeT n) const inline

operator++() [1/2]

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

operator++() [2/2]

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

DerivedT llvm::iterator_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::operator++ ( int ) inline

operator-()

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

DerivedT llvm::iterator_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::operator- ( DifferenceTypeT n) const inline

operator--() [1/2]

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

operator--() [2/2]

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

DerivedT llvm::iterator_facade_base< DerivedT, IteratorCategoryT, T, DifferenceTypeT, PointerT, ReferenceT >::operator-- ( int ) inline

operator->()

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

operator<=()

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

operator>()

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

operator>=()

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

operator[]()

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

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

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