7 #ifndef PXR_BASE_TF_ITERATOR_H
8 #define PXR_BASE_TF_ITERATOR_H
19 #include <type_traits>
35 template <
class T,
bool Reverse>
42 template <
class T,
bool Reverse>
158 template <
class T,
bool Reverse=false>
162 struct _IteratorPairAndCopy;
163 struct _IteratorPair;
167 typedef typename std::conditional<
169 _IteratorPairAndCopy, _IteratorPair
194 "TfIterator only allows rvalues that it has been told to copy "
195 "via Tf_ShouldIterateOverCopy");
211 return _data.current == _data.end;
219 return _data.current == iterator._data.current;
225 return !(*
this == iterator);
255 return *_data.current;
263 return *_data.current;
271 return _data.current;
276 explicit operator bool()
const {
277 return !(_data.current == _data.end);
284 return _data.current;
291 return _data.current;
306 struct _IteratorPair {
308 explicit _IteratorPair(
T &
c) {
315 current(b),
end(e) {}
322 struct _IteratorPairAndCopy :
public _IteratorPair {
323 _IteratorPairAndCopy() {}
324 explicit _IteratorPairAndCopy(
T const &
c) : _IteratorPair(), _copy(c) {
328 using _IteratorPair::current;
345 std::forward<T>(container));
353 std::forward<T>(container));
373 #define TF_FOR_ALL(iter, c) \
374 for (auto iter = TfMakeIterator(c); iter; ++iter)
382 #define TF_REVERSE_FOR_ALL(iter, c) \
383 for (auto iter = TfMakeReverseIterator(c); iter; ++iter)
389 template <
class T,
size_t N>
401 template <
typename UnderlyingIterator>
403 private std::reverse_iterator<UnderlyingIterator> {
406 using ReverseIterator = std::reverse_iterator<UnderlyingIterator>;
407 const ReverseIterator& _reverse_iterator()
const {
return *
this; }
408 ReverseIterator& _reverse_iterator() {
return *
this; }
410 : ReverseIterator(it) {}
412 : ReverseIterator(it) {}
422 "Tf_ProxyReferenceReverseIterator should only be used "
423 "when the underlying iterator's reference type is a "
424 "proxy (MyTypeRef) and not a true reference (MyType&)."
425 "Use std::reverse_iterator instead.");
427 std::random_access_iterator_tag>::
value,
428 "Tf_ProxyReferenceReverseIterator must wrap a random "
433 ReverseIterator(it) {
438 using ReverseIterator::base;
439 using ReverseIterator::operator*;
440 using ReverseIterator::operator[];
449 ++_reverse_iterator();
455 ++_reverse_iterator();
460 --_reverse_iterator();
466 --_reverse_iterator();
478 template <
typename OtherIt>
481 return _reverse_iterator() - other._reverse_iterator();
485 _reverse_iterator() += increment;
490 _reverse_iterator() -= decrement;
498 increment + iterator._reverse_iterator());
502 template <
typename OtherIt>
505 return lhs._reverse_iterator() == rhs._reverse_iterator();
508 template <
typename OtherIt>
511 return lhs._reverse_iterator() != rhs._reverse_iterator();
514 template <
typename OtherIt>
517 return lhs._reverse_iterator() < rhs._reverse_iterator();
520 template <
typename OtherIt>
523 return lhs._reverse_iterator() > rhs._reverse_iterator();
526 template <
typename OtherIt>
529 return lhs._reverse_iterator() <= rhs._reverse_iterator();
532 template <
typename OtherIt>
535 return lhs._reverse_iterator() >= rhs._reverse_iterator();
541 #endif // PXR_BASE_TF_ITERATOR_H
TfIterator< typename std::remove_reference< T >::type, true > TfMakeReverseIterator(T &&container)
pointer operator->() const
TfIterator GetNext() const
typename ReverseIterator::iterator_category iterator_category
static IteratorType Begin(T &c)
constexpr size_t TfArraySize(const T(&array)[N]) noexcept
Tf_ProxyReferenceReverseIterator & operator-=(difference_type decrement)
GLsizei const GLfloat * value
bool operator!=(const TfIterator &iterator) const
friend bool operator<(const Tf_ProxyReferenceReverseIterator &lhs, const Tf_ProxyReferenceReverseIterator< OtherIt > &rhs)
TfIterator()
Default constructor. This iterator is uninitialized.
TfIterator(Iterator const &begin, Iterator const &end)
Tf_ProxyReferenceReverseIterator(UnderlyingIterator it)
typename ReverseIterator::difference_type difference_type
**But if you need a result
friend bool operator>=(const Tf_ProxyReferenceReverseIterator &lhs, const Tf_ProxyReferenceReverseIterator< OtherIt > &rhs)
TfIterator(T &&container)
Allow rvalues only if the container type T should be copied by TfIterator.
typename ReverseIterator::pointer pointer
typename ReverseIterator::value_type value_type
GLint GLint GLsizei GLint GLenum GLenum type
Tf_ProxyReferenceReverseIterator & operator+=(difference_type increment)
const Iterator & base() const
static IteratorType Begin(T const &c)
static IteratorType End(T const &c)
Tf_ProxyReferenceReverseIterator operator-(difference_type decrement) const
static IteratorType End(T &c)
bool operator==(const TfIterator &iterator) const
Tf_ProxyReferenceReverseIterator()=default
Tf_ProxyReferenceReverseIterator operator+(difference_type increment) const
T::reverse_iterator IteratorType
Tf_ProxyReferenceReverseIterator & operator++()
typename ReverseIterator::iterator_type iterator_type
GLboolean GLboolean GLboolean b
friend Tf_ProxyReferenceReverseIterator operator+(const difference_type increment, const Tf_ProxyReferenceReverseIterator &iterator)
friend bool operator==(const Tf_ProxyReferenceReverseIterator &lhs, const Tf_ProxyReferenceReverseIterator< OtherIt > &rhs)
friend bool operator<=(const Tf_ProxyReferenceReverseIterator &lhs, const Tf_ProxyReferenceReverseIterator< OtherIt > &rhs)
std::iterator_traits< Iterator >::reference Reference
static IteratorType Begin(T &c)
PXR_NAMESPACE_CLOSE_SCOPE PXR_NAMESPACE_OPEN_SCOPE
static IteratorType Begin(T const &c)
Reference operator*() const
Tf_ProxyReferenceReverseIterator operator++(int)
Tf_ProxyReferenceReverseIterator operator--(int)
static IteratorType End(T &c)
Tf_ProxyReferenceReverseIterator & operator--()
TfIterator & operator++()
friend bool operator>(const Tf_ProxyReferenceReverseIterator &lhs, const Tf_ProxyReferenceReverseIterator< OtherIt > &rhs)
TfIterator operator++(int)
#define PXR_NAMESPACE_CLOSE_SCOPE
GA_API const UT_StringHolder N
static IteratorType End(T const &c)
typename ReverseIterator::reference reference
Tf_IteratorInterface< T, Reverse > IterInterface
difference_type operator-(const Tf_ProxyReferenceReverseIterator< OtherIt > &other) const
T::const_iterator IteratorType
IterInterface::IteratorType Iterator
that also have some descendant prim *whose name begins with which in turn has a child named baz where *the predicate and *a name There is also one special expression reference
T::const_reverse_iterator IteratorType
TfIterator< typename std::remove_reference< T >::type > TfMakeIterator(T &&container)
friend bool operator!=(const Tf_ProxyReferenceReverseIterator &lhs, const Tf_ProxyReferenceReverseIterator< OtherIt > &rhs)
PcpNodeRef_ChildrenIterator begin(const PcpNodeRef::child_const_range &r)
Support for range-based for loops for PcpNodeRef children ranges.