3 #ifndef DUNE_COMMON_RANGE_UTILITIES_HH
4 #define DUNE_COMMON_RANGE_UTILITIES_HH
32 typename std::enable_if<IsIterable<T>::value,
int>::type = 0>
33 typename T::value_type
35 using std::max_element;
36 return *max_element(v.begin(), v.end());
40 typename std::enable_if<!IsIterable<T>::value,
int>::type = 0>
49 typename std::enable_if<IsIterable<T>::value,
int>::type = 0>
50 typename T::value_type
52 using std::min_element;
53 return *min_element(v.begin(), v.end());
57 typename std::enable_if<!IsIterable<T>::value,
int>::type = 0>
66 typename std::enable_if<IsIterable<T>::value,
int>::type = 0>
69 for (
const auto & e : v)
75 typename std::enable_if<!IsIterable<T>::value,
int>::type = 0>
76 bool any_true(
const T & v) {
return v; }
78 template<std::
size_t N>
90 typename std::enable_if<IsIterable<T>::value,
int>::type = 0>
93 for (
const auto & e : v)
99 typename std::enable_if<!IsIterable<T>::value,
int>::type = 0>
100 bool all_true(
const T & v) {
return v; }
102 template<std::
size_t N>
114 class IntegralRangeIterator
117 typedef std::random_access_iterator_tag iterator_category;
118 typedef T value_type;
119 typedef std::make_signed_t<T> difference_type;
120 typedef const T *pointer;
123 constexpr IntegralRangeIterator() noexcept : value_(0) {}
124 constexpr
explicit IntegralRangeIterator(value_type value) noexcept : value_(value) {}
126 pointer operator->() const noexcept {
return &value_; }
127 constexpr reference
operator*() const noexcept {
return value_; }
129 constexpr reference operator[]( difference_type n )
const noexcept {
return (value_ + n); }
131 constexpr
bool operator==(
const IntegralRangeIterator & other)
const noexcept {
return (value_ == other.value_); }
132 constexpr
bool operator!=(
const IntegralRangeIterator & other)
const noexcept {
return (value_ != other.value_); }
134 constexpr
bool operator<(
const IntegralRangeIterator & other)
const noexcept {
return (value_ <= other.value_); }
135 constexpr
bool operator<=(
const IntegralRangeIterator & other)
const noexcept {
return (value_ <= other.value_); }
136 constexpr
bool operator>(
const IntegralRangeIterator & other)
const noexcept {
return (value_ >= other.value_); }
137 constexpr
bool operator>=(
const IntegralRangeIterator & other)
const noexcept {
return (value_ >= other.value_); }
139 IntegralRangeIterator& operator++() noexcept { ++value_;
return *
this; }
140 IntegralRangeIterator operator++(
int) noexcept { IntegralRangeIterator copy( *
this ); ++(*this);
return copy; }
142 IntegralRangeIterator& operator--() noexcept { --value_;
return *
this; }
143 IntegralRangeIterator operator--(
int) noexcept { IntegralRangeIterator copy( *
this ); --(*this);
return copy; }
145 IntegralRangeIterator& operator+=(difference_type n) noexcept { value_ += n;
return *
this; }
146 IntegralRangeIterator& operator-=(difference_type n) noexcept { value_ -= n;
return *
this; }
148 friend constexpr IntegralRangeIterator
operator+(
const IntegralRangeIterator &a, difference_type n) noexcept {
return IntegralRangeIterator(a.value_ + n); }
149 friend constexpr IntegralRangeIterator
operator+(difference_type n,
const IntegralRangeIterator &a) noexcept {
return IntegralRangeIterator(a.value_ + n); }
150 friend constexpr IntegralRangeIterator
operator-(
const IntegralRangeIterator &a, difference_type n) noexcept {
return IntegralRangeIterator(a.value_ - n); }
152 constexpr difference_type
operator-(
const IntegralRangeIterator &other)
const noexcept {
return (
static_cast<difference_type
>(value_) -
static_cast<difference_type
>(other.value_)); }
197 constexpr
bool empty() const noexcept {
return (from_ == to_); }
220 template <
class T, T to, T from = 0>
223 template <T ofs, T... i>
224 static std::integer_sequence<T, (i+ofs)...> shift_integer_sequence(std::integer_sequence<T, i...>);
235 typedef decltype(shift_integer_sequence<from>(std::make_integer_sequence<T, to-from>()))
integer_sequence;
251 template <
class U, U i>
252 constexpr
auto operator[](
const std::integral_constant<U, i> &)
const noexcept
253 -> std::integral_constant<value_type, from + static_cast<value_type>(i)>
262 static constexpr std::integral_constant<bool, from == to>
empty() noexcept {
return {}; }
264 static constexpr std::integral_constant<size_type, static_cast<size_type>(to) -
static_cast<size_type>(from) >
size() noexcept {
return {}; }
276 template<
class T,
class U,
277 std::enable_if_t<std::is_same<std::decay_t<T>, std::decay_t<U>>::value,
int> = 0,
278 std::enable_if_t<std::is_integral<std::decay_t<T>>::value,
int> = 0>
284 template<
class T, std::enable_if_t<std::is_
integral<std::decay_t<T>>::value,
int> = 0>
290 template<
class T, std::enable_if_t<std::is_enum<std::decay_t<T>>::value,
int> = 0>
296 template<
class T, T from, T to>
302 template<
class T, T to>
317 template<
class ProxyType>
321 PointerProxy(ProxyType&& p) : p_(p)
324 ProxyType* operator->()
335 template <class I, class F, class C = typename std::iterator_traits<I>::iterator_category>
336 class TransformedRangeIterator;
340 template <
class I,
class F>
341 class TransformedRangeIterator<I,F,std::forward_iterator_tag>
344 using iterator_category = std::forward_iterator_tag;
345 using reference = decltype(std::declval<F>()(*(std::declval<I>())));
346 using value_type = std::decay_t<reference>;
347 using pointer = PointerProxy<value_type>;
353 using FunctionPointer =
const F*;
355 constexpr TransformedRangeIterator(
const I& it, FunctionPointer f) noexcept :
372 constexpr TransformedRangeIterator() noexcept :
378 constexpr reference
operator*() const noexcept {
383 pointer operator->() const noexcept {
387 constexpr TransformedRangeIterator& operator=(
const TransformedRangeIterator& other) =
default;
389 constexpr
bool operator==(
const TransformedRangeIterator& other)
const noexcept {
390 return (it_ == other.it_);
393 constexpr
bool operator!=(
const TransformedRangeIterator& other)
const noexcept {
394 return (it_ != other.it_);
397 TransformedRangeIterator& operator++() noexcept {
402 TransformedRangeIterator operator++(
int) noexcept {
403 TransformedRangeIterator copy(*
this);
415 template <
class I,
class F>
416 class TransformedRangeIterator<I,F,std::bidirectional_iterator_tag> :
417 public TransformedRangeIterator<I,F,std::forward_iterator_tag>
420 using Base = TransformedRangeIterator<I,F,std::forward_iterator_tag>;
424 using iterator_category = std::bidirectional_iterator_tag;
425 using reference =
typename Base::reference;
426 using value_type =
typename Base::value_type;
427 using pointer =
typename Base::pointer;
429 using FunctionPointer =
typename Base::FunctionPointer;
436 constexpr TransformedRangeIterator& operator=(
const TransformedRangeIterator& other) =
default;
438 TransformedRangeIterator& operator++() noexcept {
443 TransformedRangeIterator operator++(
int) noexcept {
444 TransformedRangeIterator copy(*
this);
450 TransformedRangeIterator& operator--() noexcept {
455 TransformedRangeIterator operator--(
int) noexcept {
456 TransformedRangeIterator copy(*
this);
464 template <
class I,
class F>
465 class TransformedRangeIterator<I,F,std::random_access_iterator_tag> :
466 public TransformedRangeIterator<I,F,std::bidirectional_iterator_tag>
469 using Base = TransformedRangeIterator<I,F,std::bidirectional_iterator_tag>;
473 using iterator_category = std::random_access_iterator_tag;
474 using reference =
typename Base::reference;
475 using value_type =
typename Base::value_type;
476 using pointer =
typename Base::pointer;
477 using difference_type =
typename std::iterator_traits<I>::difference_type;
479 using FunctionPointer =
typename Base::FunctionPointer;
486 constexpr TransformedRangeIterator& operator=(
const TransformedRangeIterator& other) =
default;
488 TransformedRangeIterator& operator++() noexcept {
493 TransformedRangeIterator operator++(
int) noexcept {
494 TransformedRangeIterator copy(*
this);
502 TransformedRangeIterator& operator--() noexcept {
507 TransformedRangeIterator operator--(
int) noexcept {
508 TransformedRangeIterator copy(*
this);
514 TransformedRangeIterator& operator+=(difference_type n) noexcept {
519 TransformedRangeIterator& operator-=(difference_type n) noexcept {
524 bool operator<(
const TransformedRangeIterator& other) noexcept {
525 return it_<other.it_;
528 bool operator<=(
const TransformedRangeIterator& other) noexcept {
529 return it_<=other.it_;
532 bool operator>(
const TransformedRangeIterator& other) noexcept {
533 return it_>other.it_;
536 bool operator>=(
const TransformedRangeIterator& other) noexcept {
537 return it_>=other.it_;
540 reference operator[](difference_type n) noexcept {
541 return (*f_)(*(it_+n));
545 TransformedRangeIterator
operator+(
const TransformedRangeIterator& it, difference_type n) noexcept {
546 return TransformedRangeIterator(it.it_+n, it.f_);
550 TransformedRangeIterator
operator+(difference_type n,
const TransformedRangeIterator& it) noexcept {
551 return TransformedRangeIterator(n+it.it_, it.f_);
555 TransformedRangeIterator
operator-(
const TransformedRangeIterator& it, difference_type n) noexcept {
556 return TransformedRangeIterator(it.it_-n, it.f_);
560 difference_type
operator-(
const TransformedRangeIterator& first,
const TransformedRangeIterator& second) noexcept {
561 return first.it_-second.it_;
599 template <
class R,
class F>
602 using RawConstIterator = std::decay_t<decltype(std::declval<const R>().
begin())>;
603 using RawIterator = std::decay_t<decltype(std::declval<R>().begin())>;
621 using iterator = Impl::TransformedRangeIterator<RawIterator, F>;
636 rawRange_(std::forward<RR>(
rawRange)),
653 return iterator(rawRange_.begin(), &f_);
669 return iterator(rawRange_.end(), &f_);
682 template<
class Dummy=R,
686 return rawRange_.size();
735 template <
class R,
class F>
Traits for type conversions and type information.
typename Impl::voider< Types... >::type void_t
Is void for all valid input types (see N3911). The workhorse for C++11 SFINAE-techniques.
Definition: typetraits.hh:40
bigunsignedint< k > operator+(const bigunsignedint< k > &x, std::uintmax_t y)
Definition: bigunsignedint.hh:530
bigunsignedint< k > operator*(const bigunsignedint< k > &x, std::uintmax_t y)
Definition: bigunsignedint.hh:544
bigunsignedint< k > operator-(const bigunsignedint< k > &x, std::uintmax_t y)
Definition: bigunsignedint.hh:537
EnableIfInterOperable< T1, T2, bool >::type operator>(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition: iteratorfacades.hh:681
EnableIfInterOperable< T1, T2, bool >::type operator<(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition: iteratorfacades.hh:635
EnableIfInterOperable< T1, T2, bool >::type operator>=(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition: iteratorfacades.hh:703
EnableIfInterOperable< T1, T2, bool >::type operator<=(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition: iteratorfacades.hh:658
Dune namespace.
Definition: alignedallocator.hh:14
bool any_true(const AlignedNumber< bool, align > &val)
Definition: debugalign.hh:480
bool all_true(const AlignedNumber< bool, align > &val)
Definition: debugalign.hh:486
constexpr bool operator!=(const DebugAllocator< T > &, const DebugAllocator< T > &)
check whether allocators are not equivalent
Definition: debugallocator.hh:318
static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from >, std::integral_constant< T, to >) noexcept
Definition: rangeutilities.hh:297
T max_value(const AlignedNumber< T, align > &val)
Definition: debugalign.hh:468
auto transformedRangeView(R &&range, const F &f)
Create a TransformedRangeView.
Definition: rangeutilities.hh:736
constexpr bool operator==(const DebugAllocator< T > &, const DebugAllocator< T > &)
check whether allocators are equivalent
Definition: debugallocator.hh:310
T min_value(const AlignedNumber< T, align > &val)
Definition: debugalign.hh:474
dynamic integer range for use in range-based for loops
Definition: rangeutilities.hh:172
constexpr iterator begin() const noexcept
obtain a random-access iterator to the first element
Definition: rangeutilities.hh:189
constexpr iterator end() const noexcept
obtain a random-access iterator past the last element
Definition: rangeutilities.hh:191
std::make_unsigned_t< T > size_type
unsigned integer type corresponding to value_type
Definition: rangeutilities.hh:179
Impl::IntegralRangeIterator< T > iterator
type of iterator
Definition: rangeutilities.hh:177
constexpr value_type operator[](const value_type &i) const noexcept
access specified element
Definition: rangeutilities.hh:194
constexpr bool empty() const noexcept
check whether the range is empty
Definition: rangeutilities.hh:197
constexpr IntegralRange(std::pair< value_type, value_type > range) noexcept
construct integer range std::pair
Definition: rangeutilities.hh:186
constexpr IntegralRange(value_type from, value_type to) noexcept
construct integer range [from, to)
Definition: rangeutilities.hh:182
constexpr size_type size() const noexcept
obtain number of elements in the range
Definition: rangeutilities.hh:199
constexpr IntegralRange(value_type to) noexcept
construct integer range [0, to)
Definition: rangeutilities.hh:184
T value_type
type of integers contained in the range
Definition: rangeutilities.hh:175
static integer range for use in range-based for loops
Definition: rangeutilities.hh:222
decltype(shift_integer_sequence< from >(std::make_integer_sequence< T, to-from >())) typedef integer_sequence
type of corresponding std::integer_sequence
Definition: rangeutilities.hh:235
static constexpr iterator end() noexcept
obtain a random-access iterator past the last element
Definition: rangeutilities.hh:248
std::make_unsigned_t< T > size_type
unsigned integer type corresponding to value_type
Definition: rangeutilities.hh:232
T value_type
type of integers contained in the range
Definition: rangeutilities.hh:228
constexpr auto operator[](const std::integral_constant< U, i > &) const noexcept -> std::integral_constant< value_type, from+static_cast< value_type >(i)>
access specified element (static version)
Definition: rangeutilities.hh:252
static constexpr std::integral_constant< bool, from==to > empty() noexcept
check whether the range is empty
Definition: rangeutilities.hh:262
static constexpr std::integral_constant< size_type, static_cast< size_type >to) - static_cast< size_type >from) > size() noexcept
obtain number of elements in the range
Definition: rangeutilities.hh:264
static constexpr iterator begin() noexcept
obtain a random-access iterator to the first element
Definition: rangeutilities.hh:246
constexpr value_type operator[](const size_type &i) const noexcept
access specified element (dynamic version)
Definition: rangeutilities.hh:259
Impl::IntegralRangeIterator< T > iterator
type of iterator
Definition: rangeutilities.hh:230
A range transforming the values of another range on-the-fly.
Definition: rangeutilities.hh:601
const RawRange & rawRange() const
Export the wrapped untransformed range.
Definition: rangeutilities.hh:692
constexpr TransformedRangeView(RR &&rawRange, const F &f) noexcept
Construct from range and function.
Definition: rangeutilities.hh:635
constexpr iterator end() noexcept
Definition: rangeutilities.hh:668
constexpr iterator begin() noexcept
Definition: rangeutilities.hh:652
Impl::TransformedRangeIterator< RawIterator, F > iterator
Iterator type.
Definition: rangeutilities.hh:621
constexpr const_iterator end() const noexcept
Obtain a iterator past the last element.
Definition: rangeutilities.hh:664
constexpr const_iterator begin() const noexcept
Obtain a iterator to the first element.
Definition: rangeutilities.hh:648
auto size() const
Obtain the size of the range.
Definition: rangeutilities.hh:684
RawRange & rawRange()
Export the wrapped untransformed range.
Definition: rangeutilities.hh:700
std::remove_reference_t< R > RawRange
Export type of the wrapped untransformed range.
Definition: rangeutilities.hh:629
Impl::TransformedRangeIterator< RawConstIterator, F > const_iterator
Const iterator type.
Definition: rangeutilities.hh:613