5 #ifndef VCCC_RANGES_VIEWS_TRANSFORM_VIEW_HPP
6 #define VCCC_RANGES_VIEWS_TRANSFORM_VIEW_HPP
46 struct transform_view_iterator_category_2 {
50 struct transform_view_iterator_category_2<contiguous_iterator_tag> {
59 template<
typename V,
typename F>
71 struct transform_view_iterator_category {
72 #if __cplusplus < 202002L
76 template<
typename Base>
77 struct transform_view_iterator_category<Base, true> {
78 using iterator_category =
80 std::is_reference<invoke_result_t<F&, range_reference_t<Base>>>
::value,
81 detail::transform_view_iterator_category_2<typename cxx20_iterator_traits<iterator_t<Base>>::iterator_category>,
93 class iterator :
public transform_view_iterator_category<std::conditional_t<Const, const V, V>> {
94 using Parent = std::conditional_t<Const, const transform_view, transform_view>;
111 #if __cplusplus < 202002L
121 template<
bool AntiConst, std::enable_if_t<
conjunction<
126 : current_(
std::move(i.current_)), parent_(i.praent_) {}
131 constexpr decltype(
auto) operator*()
const {
182 template<
typename B = Base, std::enable_if_t<equality_comparable<iterator_t<B>>::value,
int> = 0>
184 return x.current_ == y.current_;
187 template<
typename B = Base, std::enable_if_t<equality_comparable<iterator_t<B>>::value,
int> = 0>
194 return x.current_ < y.current_;
214 return iterator{*i.parent_, i.current_ + n};
219 return iterator{*i.parent_, i.current_ + n};
224 return iterator{*i.parent_, i.current_ - n};
227 template<
typename B = Base, std::enable_if_t<sized_sentinel_for<iterator_t<B>, iterator_t<B>>::value,
int> = 0>
229 return x.current_ - y.current_;
233 noexcept(noexcept(
vccc::
invoke(
std::declval<const F&>(), *i.current_)))
235 return iter_move_ref(*i);
240 static constexpr decltype(
auto) iter_move_ref(T&& ref) {
241 return std::forward<T>(ref);
244 static constexpr decltype(
auto) iter_move_ref(T& ref) {
245 return std::move(ref);
248 iterator_t<Base> current_;
249 Parent* parent_ =
nullptr;
254 using Parent = std::conditional_t<Const, const transform_view, transform_view>;
263 template<
bool AntiConst, std::enable_if_t<
conjunction<
268 : end_(
std::move(i.end_)) {}
276 return x.current_ == y.end_;
291 template<
typename B = Base, std::enable_if_t<sized_sentinel_for<sentinel_t<B>, iterator_t<B>>::value,
int> = 0>
294 return x.current_ - y.end_;
297 template<
typename B = Base, std::enable_if_t<sized_sentinel_for<sentinel_t<B>, iterator_t<B>>::value,
int> = 0>
300 return y.end_ - x.current_;
317 return std::move(base_);
324 template<
typename V2 =
const V,
typename F2 =
const F, std::enable_if_t<
conjunction<
342 template<
typename V2 =
const V,
typename F2 =
const F, std::enable_if_t<
conjunction<
351 template<
typename V2 =
const V,
typename F2 =
const F, std::enable_if_t<
conjunction<
374 template<
typename R,
typename F, std::enable_if_t<
conjunction<
375 input_range<views::all_t<R>>,
380 constexpr transform_view<views::all_t<R>, F>
385 #if __cplusplus >= 201703L
387 template<
typename R,
typename F>
helper class template for defining a view, using the curiously recurring template pattern
Definition: view_interface.hpp:78
constexpr invoke_result_t< F, Args... > invoke(F &&f, Args &&... args) noexcept(is_nothrow_invocable< F, Args... >::value)
Definition: invoke.hpp:38
std::forward_iterator_tag forward_iterator_tag
Definition: iterator_tag.hpp:17
std::random_access_iterator_tag random_access_iterator_tag
Definition: iterator_tag.hpp:19
std::input_iterator_tag input_iterator_tag
Definition: iterator_tag.hpp:15
std::bidirectional_iterator_tag bidirectional_iterator_tag
Definition: iterator_tag.hpp:18
std::enable_if_t< std::is_object< T >::value, T * > addressof(T &t) noexcept
Definition: addressof.hpp:33
typename sentinel< R >::type sentinel_t
Definition: sentinel_t.hpp:29
typename ranges::iterator< T >::type iterator_t
Definition: iterator_t.hpp:32
constexpr VCCC_INLINE_OR_STATIC detail::begin_niebloid begin
returns an iterator to the beginning of a range
Definition: begin.hpp:116
constexpr VCCC_INLINE_OR_STATIC detail::size_niebloid size
returns the size of a container or array
Definition: size.hpp:145
constexpr VCCC_INLINE_OR_STATIC detail::end_niebloid end
returns a sentinel indicating the end of a range
Definition: end.hpp:120
typename range_difference< R >::type range_difference_t
Used to obtain the difference type of the iterator type of range type R.
Definition: range_difference_t.hpp:41
typename range_reference< R >::type range_reference_t
Used to obtain the reference type of the iterator type of range type R.
Definition: range_reference_t.hpp:42
constexpr transform_view< views::all_t< R >, F > make_transform_view(R &&r, F f)
Definition: transform_view.hpp:381
std::integral_constant< bool, v > bool_constant
Definition: bool_constant.hpp:19
typename invoke_result< F, Args... >::type invoke_result_t
Definition: is_invocable.hpp:66
std::conditional_t< Const, const V, V > maybe_const
Definition: maybe_const.hpp:16
Definition: matrix.hpp:495
Definition: cxx20_rel_ops.hpp:17
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35
Definition: conjunction.hpp:22
Models std::convertible_to
Definition: convertible_to.hpp:38
specifies that an object of a type can be copy constructed and move constructed
Definition: copy_constructible.hpp:55
Definition: iterator_tag.hpp:28
Definition: negation.hpp:23
specifies a range whose iterator type satisfies bidirectional_iterator
Definition: bidirectional_range.hpp:49
Definition: common_range.hpp:41
specifies a range whose iterator type satisfies forward_iterator
Definition: forward_range.hpp:47
specifies a range whose iterator type satisfies random_access_iterator
Definition: random_access_range.hpp:48
specifies that a type is a range, that is, it provides a begin iterator and an end sentinel
Definition: range.hpp:53
specifies that a range is a view, that is, it has constant time copy/move/assignment
Definition: view.hpp:31
specifies that a callable type can be invoked with a given set of argument types
Definition: invocable.hpp:64