18#include <seqan3/contrib/std/detail/movable_box.hpp>
47template <std::ranges::view urng_t,
typename fun_t,
bool or_throw,
bool and_consume>
48class view_take_until :
public std::ranges::view_interface<view_take_until<urng_t, fun_t, or_throw, and_consume>>
51 static_assert(std::invocable<fun_t, std::ranges::range_reference_t<urng_t>>,
52 "The functor type for detail::take_until must model"
53 "std::invocable<fun_t, std::ranges::range_reference_t<urng_t>>.");
54 static_assert(std::convertible_to<std::invoke_result_t<fun_t &&, std::ranges::range_reference_t<urng_t>>,
bool>,
55 "The result type of the functor for detail::take_until must be a boolean.");
61 seqan::stl::detail::movable_box_t<fun_t>
fun;
69 template <
bool const_range>
74 template <
bool const_range>
79 template <
bool const_range>
84 template <
bool const_range>
104 fun{
std::forward<fun_t>(_fun)}
112 template <std::ranges::viewable_range rng_t>
113 requires std::constructible_from<urng_t, std::views::all_t<rng_t>>
137 if constexpr (and_consume && !std::ranges::forward_range<urng_t>)
147 if constexpr (and_consume && !std::ranges::forward_range<urng_t const>)
168 if constexpr (and_consume && !std::ranges::forward_range<urng_t>)
178 if constexpr (and_consume && !std::ranges::forward_range<urng_t const>)
188template <
typename urng_t,
typename fun_t,
bool or_throw = false,
bool and_consume = false>
191template <std::ranges::view urng_t,
typename fun_t,
bool or_throw,
bool and_consume>
192template <
bool const_range>
195 seqan3::detail::maybe_const_iterator_t<const_range, urng_t>>
204 seqan::stl::detail::movable_box_t<fun_t>
const *
fun{
nullptr};
213 bool at_end_gracefully =
false;
229 seqan::stl::detail::movable_box_t<fun_t>
const & _fun,
231 base_t{std::move(it)},
233 underlying_sentinel{std::move(sen)}
235 if ((this->base() != underlying_sentinel) &&
fun->operator()(**
this))
237 at_end_gracefully =
true;
260 noexcept(noexcept(++
std::declval<
base_t &>())
264 base_t::operator++();
266 while ((this->base() != underlying_sentinel) &&
fun->operator()(**
this))
268 at_end_gracefully =
true;
269 base_t::operator++();
276 decltype(
auto)
operator++(
int)
noexcept(
noexcept(++std::declval<basic_consume_iterator &>())
277 && (std::same_as<
decltype(std::declval<underlying_iterator_t &>()++),
void>
278 || std::is_nothrow_copy_constructible_v<basic_consume_iterator>))
281 if constexpr (std::same_as<decltype(std::declval<underlying_iterator_t &>()++),
void>)
300 &&
noexcept(std::declval<underlying_iterator_t &>() != std::declval<underlying_sentinel_t &>())
301 &&
noexcept(
fun->operator()(std::declval<reference>())))
303 if (at_end_gracefully)
306 if (this->base() == underlying_sentinel)
308 if constexpr (or_throw)
314 return fun->operator()(**this);
319 noexcept(
noexcept(rhs == lhs))
326 noexcept(
noexcept(std::declval<basic_consume_iterator &>() == rhs))
328 return !(*
this == rhs);
333 noexcept(
noexcept(rhs != lhs))
340template <std::ranges::view urng_t,
typename fun_t,
bool or_throw,
bool and_consume>
341template <
bool const_range>
352 seqan::stl::detail::movable_box_t<fun_t>
const *
fun{
nullptr};
370 seqan::stl::detail::movable_box_t<fun_t>
const & _fun) :
371 underlying_sentinel{
std::move(underlying_sentinel)},
378 : underlying_sentinel{std::move(other.underlying_sentinel)},
fun{other.fun}
392 if constexpr (or_throw)
398 return rhs.
fun->operator()(*lhs);
410 return !(lhs == rhs);
420 template <
bool other_const_range = !const_range>
421 requires (std::sentinel_for<underlying_sentinel_t, basic_iterator<other_const_range>>)
427 if constexpr (or_throw)
433 return rhs.
fun->operator()(*lhs);
437 template <
bool other_const_range = !const_range>
438 requires (std::sentinel_for<underlying_sentinel_t, basic_iterator<other_const_range>>)
445 template <
bool other_const_range = !const_range>
446 requires (std::sentinel_for<underlying_sentinel_t, basic_iterator<other_const_range>>)
449 return !(lhs == rhs);
453 template <
bool other_const_range = !const_range>
454 requires (std::sentinel_for<underlying_sentinel_t, basic_iterator<other_const_range>>)
469template <
bool or_throw,
bool and_consume>
473 template <
typename fun_t>
486 template <std::ranges::viewable_range urng_t,
typename fun_t>
487 constexpr auto operator()(urng_t && urange, fun_t && fun)
const
490 std::views::all(std::forward<urng_t>(urange)),
491 std::forward<fun_t>(fun)};
610template <std::ranges::view urng_t,
typename fun_t,
bool or_throw,
bool and_consume>
611inline constexpr bool enable_borrowed_range<seqan3::detail::view_take_until<urng_t, fun_t, or_throw, and_consume>> =
612 enable_borrowed_range<urng_t>;
Provides seqan3::detail::adaptor_from_functor.
Template for range adaptor closure objects that store arguments and wrap a proto-adaptor.
Definition adaptor_from_functor.hpp:54
A CRTP base template for creating iterators that inherit from other iterators.
Definition inherited_iterator_base.hpp:49
Special iterator type used when consuming behaviour is selected.
Definition take_until_view.hpp:196
seqan3::detail::maybe_const_sentinel_t< const_range, urng_t > underlying_sentinel_t
The sentinel type is identical to that of the underlying range.
Definition take_until_view.hpp:207
~basic_consume_iterator()=default
Defaulted.
seqan3::detail::maybe_const_iterator_t< const_range, urng_t > underlying_iterator_t
The iterator type of the underlying range.
Definition take_until_view.hpp:199
detail::iter_pointer_t< underlying_iterator_t > pointer
From base.
Definition take_until_view.hpp:250
constexpr basic_consume_iterator & operator=(basic_consume_iterator const &rhs)=default
Defaulted.
constexpr basic_consume_iterator(basic_consume_iterator const &rhs)=default
Defaulted.
constexpr basic_consume_iterator & operator=(basic_consume_iterator &&rhs)=default
Defaulted.
basic_consume_iterator(underlying_iterator_t it, seqan::stl::detail::movable_box_t< fun_t > const &_fun, underlying_sentinel_t sen) noexcept(noexcept(base_t{it}))
Constructor that delegates to the CRTP layer and initialises the callable.
Definition take_until_view.hpp:228
constexpr basic_consume_iterator(basic_consume_iterator &&rhs)=default
Defaulted.
bool operator==(basic_consume_sentinel< const_range > const &) const noexcept(!or_throw &&noexcept(std::declval< underlying_iterator_t & >() !=std::declval< underlying_sentinel_t & >()) &&noexcept(fun->operator()(std::declval< reference >())))
Return the saved at_end state.
Definition take_until_view.hpp:298
friend bool operator!=(basic_consume_sentinel< const_range > const &lhs, basic_consume_iterator const &rhs) noexcept(noexcept(rhs !=lhs))
Return the saved at_end state.
Definition take_until_view.hpp:332
friend bool operator==(basic_consume_sentinel< const_range > const &lhs, basic_consume_iterator const &rhs) noexcept(noexcept(rhs==lhs))
Return the saved at_end state.
Definition take_until_view.hpp:318
bool operator!=(basic_consume_sentinel< const_range > const &rhs) const noexcept(noexcept(std::declval< basic_consume_iterator & >()==rhs))
Return the saved at_end state.
Definition take_until_view.hpp:325
constexpr basic_consume_iterator()=default
Defaulted.
underlying_sentinel_t underlying_sentinel
Whether this iterator has reached the end (cache is only used on pure input ranges).
Definition take_until_view.hpp:210
basic_consume_iterator & operator++() noexcept(noexcept(++std::declval< base_t & >()) &&noexcept(std::declval< underlying_iterator_t & >() !=std::declval< underlying_sentinel_t & >()) &&noexcept(fun->operator()(std::declval< reference >())))
Override pre-increment to implement consuming behaviour.
Definition take_until_view.hpp:259
The sentinel type of take_until, provides the comparison operators.
Definition take_until_view.hpp:343
friend bool operator!=(basic_sentinel const &lhs, basic_iterator< const_range > const &rhs)
Compares lhs with rhs for inequality.
Definition take_until_view.hpp:414
basic_sentinel(basic_sentinel<!const_range > other) &&std
Construct from a not const range a const range.
Definition take_until_view.hpp:376
basic_sentinel(basic_sentinel &&)=default
Defaulted.
underlying_sentinel_t underlying_sentinel
The actual end of the underlying range.
Definition take_until_view.hpp:349
seqan::stl::detail::movable_box_t< fun_t > const * fun
Pointer to the functor stored in the view.
Definition take_until_view.hpp:352
~basic_sentinel()=default
Defaulted.
basic_sentinel()=default
Defaulted.
basic_sentinel(underlying_sentinel_t underlying_sentinel, seqan::stl::detail::movable_box_t< fun_t > const &_fun)
Construct from a sentinel and a functor.
Definition take_until_view.hpp:369
seqan3::detail::maybe_const_sentinel_t< const_range, urng_t > underlying_sentinel_t
The sentinel type of the underlying range.
Definition take_until_view.hpp:346
friend bool operator==(basic_sentinel const &lhs, basic_iterator< const_range > const &rhs)
Compares lhs with rhs for equality.
Definition take_until_view.hpp:402
friend bool operator==(basic_iterator< const_range > const &lhs, basic_sentinel const &rhs)
Compares lhs with rhs for equality.
Definition take_until_view.hpp:387
friend bool operator!=(basic_iterator< const_range > const &lhs, basic_sentinel const &rhs)
Compares lhs with rhs for inequality.
Definition take_until_view.hpp:408
basic_sentinel & operator=(basic_sentinel const &)=default
Defaulted.
basic_sentinel & operator=(basic_sentinel &&)=default
Defaulted.
basic_sentinel(basic_sentinel const &)=default
Defaulted.
The type returned by seqan3::detail::take_until and seqan3::detail::take_until_or_throw.
Definition take_until_view.hpp:49
constexpr view_take_until(view_take_until &&rhs)=default
Defaulted.
view_take_until(rng_t &&_urange, fun_t &&_fun)
Construct from another viewable_range.
Definition take_until_view.hpp:114
std::default_sentinel_t basic_consume_sentinel
The sentinel type of take_until when consuming behaviour is selected.
Definition take_until_view.hpp:85
constexpr view_take_until & operator=(view_take_until &&rhs)=default
Defaulted.
auto begin() noexcept
Returns an iterator to the first element of the container.
Definition take_until_view.hpp:135
view_take_until()=default
Defaulted.
auto end() const noexcept
Returns an iterator to the element following the last element of the range.
Definition take_until_view.hpp:175
view_take_until(urng_t &&_urange, fun_t &&_fun)
Construct from another range.
Definition take_until_view.hpp:102
constexpr view_take_until & operator=(view_take_until const &rhs)=default
Defaulted.
seqan::stl::detail::movable_box_t< fun_t > fun
The functor.
Definition take_until_view.hpp:61
auto begin() const noexcept
Returns an iterator to the first element of the container.
Definition take_until_view.hpp:144
urng_t urange
The underlying range.
Definition take_until_view.hpp:58
static constexpr bool const_iterable
Whether this view is const_iterable or not.
Definition take_until_view.hpp:64
constexpr view_take_until(view_take_until const &rhs)=default
Defaulted.
~view_take_until()=default
Defaulted.
seqan3::detail::maybe_const_iterator_t< const_range, urng_t > basic_iterator
Iterator of the underlying range (urng_t).
Definition take_until_view.hpp:70
view_take_until(urng_t &&, fun_t &&) -> view_take_until< std::views::all_t< urng_t >, fun_t, or_throw, and_consume >
Type deduction guide that strips references.
auto end() noexcept
Returns an iterator to the element following the last element of the range.
Definition take_until_view.hpp:166
Provides various transformation traits used by the range module.
std::ranges::sentinel_t< maybe_const_range_t< const_v, range_t > > maybe_const_sentinel_t
Returns the const sentinel of range_t if const_range is true; otherwise the non-const sentinel.
Definition core/range/type_traits.hpp:46
std::ranges::iterator_t< maybe_const_range_t< const_range, range_t > > maybe_const_iterator_t
Returns the const iterator of range_t if const_range is true; otherwise the non-const iterator.
Definition core/range/type_traits.hpp:41
typename iter_pointer< it_t >::type iter_pointer_t
Return the pointer type of the input type (transformation_trait shortcut).
Definition iterator_traits.hpp:151
constexpr auto take_until
A view adaptor that returns elements from the underlying range until the functor evaluates to true (o...
Definition take_until_view.hpp:561
constexpr auto take_until_or_throw_and_consume
A view adaptor that returns elements from the underlying range until the functor evaluates to true (t...
Definition take_until_view.hpp:603
constexpr auto take_until_and_consume
A view adaptor that returns elements from the underlying range until the functor evaluates to true (o...
Definition take_until_view.hpp:589
constexpr auto take_until_or_throw
A view adaptor that returns elements from the underlying range until the functor evaluates to true (t...
Definition take_until_view.hpp:575
Provides the seqan3::detail::inherited_iterator_base template.
Specifies requirements of an input range type for which the const version of that type satisfies the ...
Provides exceptions used in the I/O module.
Provides various transformation traits for use on iterators.
The internal SeqAn3 namespace.
Definition aligned_sequence_concept.hpp:26
SeqAn specific customisations in the standard namespace.
View adaptor definition for detail::take_until and detail::take_until_or_throw.
Definition take_until_view.hpp:471
constexpr auto operator()(fun_t &&fun) const
Store the arguments and return a range adaptor closure object.
Definition take_until_view.hpp:474
constexpr auto operator()(urng_t &&urange, fun_t &&fun) const
Call the view's constructor with the given parameters.
Definition take_until_view.hpp:487
Additional non-standard concepts for ranges.