5 #ifndef VCCC_RANGES_VIEWS_REPEAT_VIEW_HPP
6 #define VCCC_RANGES_VIEWS_REPEAT_VIEW_HPP
10 #include <type_traits>
33 template<
typename W,
typename Bound = unreachable_sentinel_t>
39 static_assert(
same_as<W, std::remove_cv_t<W>>::
value,
"Constraints not satisfied");
53 #if __cplusplus < 202002L
58 constexpr
iterator() : value_(nullptr), current_() {}
101 return x.current_ == y.current_;
109 return x.current_ < y.current_;
113 return (x == y) || (x < y);
144 constexpr
explicit iterator(
const W*
value, index_type b = index_type())
145 : value_(
value), current_(b)
155 : value_(W()), bound_(Bound()) {}
158 : value_(
value), bound_(bound){}
161 : value_(
std::move(
value)), bound_(bound){}
163 template<
typename... WArgs,
typename... BoundArgs, std::enable_if_t<
conjunction<
167 constexpr
repeat_view(std::piecewise_construct_t, std::tuple<WArgs...> value_args, std::tuple<BoundArgs...> bound_args = std::tuple<>())
169 std::index_sequence_for<WArgs...>{}, std::index_sequence_for<BoundArgs...>{}) {}
175 template<
typename B = Bound, std::enable_if_t<
182 template<
typename B = Bound, std::enable_if_t<
189 template<
typename B = Bound, std::enable_if_t<
193 using R = std::make_unsigned_t<Bound>;
194 return static_cast<R
>(bound_);
198 template<
typename WTuple,
typename BoundTuple, std::size_t... I, std::size_t... J>
200 std::piecewise_construct_t, WTuple&& value_args, BoundTuple&& bound_args,
201 std::index_sequence<I...>, std::index_sequence<J...>)
202 : value_(
std::
get<I>(
std::forward<WTuple>(value_args))...), bound_(
std::
get<J>(
std::forward<BoundTuple>(bound_args))...) {}
208 #if __cplusplus >= 201703L
210 template<
typename W,
typename Bound>
211 repeat_view(W, Bound) -> repeat_view<W, Bound>;
#define VCCC_ADDRESSOF_CONSTEXPR
Definition: addressof.hpp:14
Definition: repeat_view.hpp:43
constexpr friend bool operator<(const iterator &x, const iterator &y)
Definition: repeat_view.hpp:108
void pointer
Definition: repeat_view.hpp:54
constexpr friend difference_type operator-(const iterator &x, const iterator &y)
Definition: repeat_view.hpp:139
constexpr friend bool operator!=(const iterator &x, const iterator &y)
Definition: repeat_view.hpp:104
constexpr const W & operator*() const noexcept
Definition: repeat_view.hpp:60
constexpr const W & operator[](difference_type n) const noexcept
Definition: repeat_view.hpp:64
constexpr friend iterator operator+(iterator i, difference_type n)
Definition: repeat_view.hpp:124
constexpr friend bool operator==(const iterator &x, const iterator &y)
Definition: repeat_view.hpp:100
constexpr friend iterator operator-(iterator i, difference_type n)
Definition: repeat_view.hpp:134
constexpr iterator & operator+=(difference_type n)
Definition: repeat_view.hpp:90
random_access_iterator_tag iterator_category
Definition: repeat_view.hpp:49
W value_type
Definition: repeat_view.hpp:50
constexpr iterator & operator--()
Definition: repeat_view.hpp:79
constexpr friend bool operator>(const iterator &x, const iterator &y)
Definition: repeat_view.hpp:116
std::conditional_t< is_signed_integer_like< index_type >::value, index_type, detail::iota_diff_t< index_type > > difference_type
Definition: repeat_view.hpp:52
constexpr friend bool operator>=(const iterator &x, const iterator &y)
Definition: repeat_view.hpp:120
constexpr iterator & operator-=(difference_type n)
Definition: repeat_view.hpp:95
constexpr friend bool operator<=(const iterator &x, const iterator &y)
Definition: repeat_view.hpp:112
constexpr iterator operator--(int)
Definition: repeat_view.hpp:84
constexpr iterator operator++(int)
Definition: repeat_view.hpp:73
constexpr iterator & operator++()
Definition: repeat_view.hpp:68
random_access_iterator_tag iterator_concept
Definition: repeat_view.hpp:48
const W & reference
Definition: repeat_view.hpp:55
constexpr iterator()
Definition: repeat_view.hpp:58
constexpr friend iterator operator+(difference_type n, iterator i)
Definition: repeat_view.hpp:129
Definition: repeat_view.hpp:34
constexpr repeat_view(const W &value, Bound bound=Bound())
Definition: repeat_view.hpp:157
constexpr auto size() const
Definition: repeat_view.hpp:192
VCCC_ADDRESSOF_CONSTEXPR iterator end() const
Definition: repeat_view.hpp:178
repeat_view()
Definition: repeat_view.hpp:154
constexpr repeat_view(W &&value, Bound bound=Bound())
Definition: repeat_view.hpp:160
constexpr repeat_view(std::piecewise_construct_t, std::tuple< WArgs... > value_args, std::tuple< BoundArgs... > bound_args=std::tuple<>())
Definition: repeat_view.hpp:167
VCCC_ADDRESSOF_CONSTEXPR iterator begin() const
Definition: repeat_view.hpp:171
constexpr unreachable_sentinel_t end() const
Definition: repeat_view.hpp:185
helper class template for defining a view, using the curiously recurring template pattern
Definition: view_interface.hpp:78
constexpr VCCC_INLINE_OR_STATIC unreachable_sentinel_t unreachable_sentinel
Definition: unreachable_sentinel.hpp:25
std::random_access_iterator_tag random_access_iterator_tag
Definition: iterator_tag.hpp:19
std::enable_if_t< std::is_object< T >::value, T * > addressof(T &t) noexcept
Definition: addressof.hpp:33
constexpr auto get(const subrange< I, S, K > &r)
Definition: subrange.hpp:371
Definition: matrix.hpp:495
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35
Definition: conjunction.hpp:22
specifies that a variable of the type can be constructed from or bound to a set of argument types
Definition: constructible_from.hpp:31
Definition: disjunction.hpp:22
Check if type models integer-like type (C++ 20 requirement)
Definition: is_integer_like.hpp:34
Definition: is_integer_like.hpp:48
Definition: negation.hpp:23
Models std::same_as
Definition: same_as.hpp:33
specifies that an object of a type can be copied, moved, swapped, and default constructed
Definition: semiregular.hpp:31
sentinel that always compares unequal to any weakly_incrementable type
Definition: unreachable_sentinel.hpp:17