16#ifndef vtkCollectionRange_h
17#define vtkCollectionRange_h
31template <
typename CollectionType>
32struct CollectionRange;
33template <
typename CollectionType>
34struct CollectionIterator;
43template <
typename CollectionType,
typename T = CollectionType>
49template <
typename CollectionType>
73 static auto GetType(...) ->
decltype(std::declval<T>().GetNextItemAsObject());
77 static auto GetType(
int) ->
decltype(std::declval<T>().GetNextItem());
79 using PointerType =
decltype(GetType<CollectionType>(0));
83 using Type =
typename std::remove_pointer<PointerType>::type;
99template <
typename CollectionType>
101 :
public std::iterator<std::forward_iterator_tag,
102 typename GetCollectionItemType<CollectionType>::Type*, int,
103 typename GetCollectionItemType<CollectionType>::Type*,
104 typename GetCollectionItemType<CollectionType>::Type*>
110 using Superclass = std::iterator<std::forward_iterator_tag, ItemType*, int, ItemType*, ItemType*>;
135 auto elem = this->Element;
146 return lhs.Element == rhs.Element;
151 return lhs.Element != rhs.Element;
157 swap(lhs.Element, rhs.Element);
169 void Increment() noexcept
171 this->Element = this->Element->
Next;
174 ItemType* GetItem() const noexcept {
return static_cast<ItemType*
>(this->Element->
Item); }
183template <
typename CollectionType>
184struct CollectionRange
186 static_assert(IsCollection<CollectionType>::value,
"Invalid vtkCollection subclass.");
202 assert(this->Collection);
207 size_type size() const noexcept {
return this->Collection->GetNumberOfItems(); }
212 this->Collection->InitTraversal(cookie);
223 this->Collection->InitTraversal(cookie);
vtkCollectionElement * Next
Hold a reference to a vtkObjectBase instance.
typename std::enable_if< IsCollection< CollectionType >::value, T >::type EnableIfIsCollection
Specialization of tuple ranges and iterators for vtkAOSDataArrayTemplate.
CollectionIterator operator++(int) noexcept
typename Superclass::value_type value_type
reference operator*() const noexcept
CollectionIterator & operator++() noexcept
typename Superclass::reference reference
CollectionIterator & operator=(const CollectionIterator &o) noexcept=default
typename Superclass::difference_type difference_type
typename Superclass::pointer pointer
CollectionIterator() noexcept
typename Superclass::iterator_category iterator_category
CollectionIterator(vtkCollectionElement *element) noexcept
friend void swap(CollectionIterator &lhs, CollectionIterator &rhs) noexcept
pointer operator->() const noexcept
CollectionIterator(const CollectionIterator &o) noexcept=default
friend bool operator==(const CollectionIterator &lhs, const CollectionIterator &rhs) noexcept
friend bool operator!=(const CollectionIterator &lhs, const CollectionIterator &rhs) noexcept
CollectionRange(CollectionType *coll) noexcept
ItemType * const_reference
CollectionType * GetCollection() const noexcept
typename GetCollectionItemType< CollectionType >::Type ItemType
size_type size() const noexcept
const_iterator cbegin() const
const_iterator cend() const
typename std::remove_pointer< PointerType >::type Type
void * vtkCollectionSimpleIterator