1#ifndef _BBM_ITERATOR_UTIL_H_
2#define _BBM_ITERATOR_UTIL_H_
24 if constexpr (std::ranges::range<T>)
return std::ranges::size(t);
31 if constexpr (std::ranges::range<T>)
return std::ranges::begin(t);
32 else return std::addressof(t);
38 if constexpr (std::ranges::range<T>)
return std::ranges::cbegin(t);
45 if constexpr (std::ranges::range<T>)
return std::ranges::end(t);
52 if constexpr (std::ranges::range<T>)
return std::ranges::cend(t);
53 else return bbm::end(std::as_const(t));
60 template<
typename T>
requires std::ranges::range<T>
67 template<
typename CASTTYPE,
typename ITR>
requires std::input_or_output_iterator<ITR>
84 template<
typename C,
typename I>
130 template<
typename T>
struct is_cast_itr_impl : std::false_type {};
131 template<
typename C,
typename T>
struct is_cast_itr_impl<cast_itr<C, T>> : std::true_type{};
133 template<
typename T>
struct underlying_itr_impl {
using type = T; };
134 template<
typename C,
typename T>
struct underlying_itr_impl<cast_itr<C, T>> {
using type = T; };
141 using is_cast_itr = bbm::detail::is_cast_itr_impl<std::decay_t<T>>;
Cast iterator; cast the result after deferencing.
Definition: iterator_util.h:69
reference operator*(void) const
cast the derefenced value to CASTYPE&
Definition: iterator_util.h:113
cast_itr & operator--(void)
Definition: iterator_util.h:102
cast_itr(const cast_itr< C, I > &itr)
construct from cast_itr
Definition: iterator_util.h:85
cast_itr(const ITR &itr)
constructor
Definition: iterator_util.h:81
bool operator!=(const cast_itr &itr) const
Definition: iterator_util.h:89
bool operator<=(const cast_itr &itr) const
Definition: iterator_util.h:90
value_type * pointer
Definition: iterator_util.h:75
ITR _itr
Definition: iterator_util.h:125
cast_itr operator-(size_t step) const
Definition: iterator_util.h:105
cast_itr(void)
empty constructor
Definition: iterator_util.h:78
cast_itr operator+(size_t step) const
Definition: iterator_util.h:100
cast_itr & operator++(void)
Definition: iterator_util.h:97
cast_itr & operator-=(size_t step)
Definition: iterator_util.h:104
value_type & reference
Definition: iterator_util.h:74
typename std::iterator_traits< ITR >::iterator_category iterator_category
Definition: iterator_util.h:71
cast_itr & operator+=(size_t step)
Definition: iterator_util.h:99
pointer operator->(void) const
cast the dereferenced value to CASTTYPE*
Definition: iterator_util.h:116
std::remove_reference_t< CASTTYPE > value_type
Definition: iterator_util.h:73
bool operator>(const cast_itr &itr) const
Definition: iterator_util.h:93
auto raw_iterator(void) const
underlying iterator
Definition: iterator_util.h:122
bool operator==(const cast_itr &itr) const
Definition: iterator_util.h:88
typename std::iterator_traits< ITR >::difference_type difference_type
Definition: iterator_util.h:72
auto operator[](size_t idx) const
Definition: iterator_util.h:109
cast_itr operator++(int)
Definition: iterator_util.h:98
difference_type operator-(const cast_itr &itr)
Definition: iterator_util.h:107
cast_itr operator--(int)
Definition: iterator_util.h:103
bool operator>=(const cast_itr &itr) const
Definition: iterator_util.h:92
decltype(auto) raw_dereference(void) const
dereference without casting
Definition: iterator_util.h:119
bool operator<(const cast_itr &itr) const
Definition: iterator_util.h:91
Definition: aggregatebsdf.h:29
constexpr bool is_cast_itr_v
Definition: iterator_util.h:144
typename bbm::detail::underlying_itr_impl< std::decay_t< T > >::type underlying_itr_t
Definition: iterator_util.h:147
auto end(T &&t)
Definition: iterator_util.h:43
size_t size(T &&t)
Definition: iterator_util.h:22
auto cend(T &&t)
Definition: iterator_util.h:50
bbm::detail::is_cast_itr_impl< std::decay_t< T > > is_cast_itr
Definition: iterator_util.h:141
std::decay_t< decltype(*bbm::begin(std::declval< T >()))> iterable_value_t
Definition: iterator_util.h:61
auto begin(T &&t)
Definition: iterator_util.h:29
auto cbegin(T &&t)
Definition: iterator_util.h:36
Additional basic helper concepts.