48template <std::ranges::view urng_t,
bool or_throw>
49class view_take_exactly :
public std::ranges::view_interface<view_take_exactly<urng_t, or_throw>>
59 template <
bool const_range>
94 if constexpr (std::ranges::sized_range<urng_t>)
98 if constexpr (or_throw)
101 "You are trying to construct a detail::take_exactly_or_throw from a range that is strictly "
118 template <std::ranges::viewable_range rng_t>
119 requires std::constructible_from<rng_t, std::views::all_t<rng_t>>
143 if constexpr (std::ranges::random_access_range<urng_t> && std::ranges::sized_range<urng_t>)
150 constexpr auto begin() const noexcept
153 if constexpr (std::ranges::random_access_range<urng_t> && std::ranges::sized_range<urng_t>)
150 constexpr auto begin() const noexcept {
…}
176 constexpr auto end() noexcept
178 if constexpr (std::ranges::random_access_range<urng_t> && std::ranges::sized_range<urng_t>)
181 return std::ranges::end(
urange);
176 constexpr auto end() noexcept {
…}
185 constexpr auto end() const noexcept
188 if constexpr (std::ranges::random_access_range<urng_t> && std::ranges::sized_range<urng_t>)
191 return std::ranges::cend(
urange);
185 constexpr auto end() const noexcept {
…}
206 constexpr auto size() const noexcept
206 constexpr auto size() const noexcept {
…}
49class view_take_exactly :
public std::ranges::view_interface<view_take_exactly<urng_t, or_throw>> {
…};
214template <
typename urng_t,
bool or_throw = false>
219template <std::ranges::view urng_t,
bool or_throw>
220template <
bool const_range>
261 size_t const _max_pos,
263 base_t{
std::move(it)},
269 if constexpr (!std::forward_iterator<base_base_t>)
271 assert(host_ptr !=
nullptr);
276 using typename base_t::difference_type;
277 using typename base_t::reference;
287 base_t::operator++();
289 if constexpr (!std::forward_iterator<base_base_t>)
290 --host_ptr->target_size;
295 constexpr decltype(
auto)
operator++(
int)
noexcept(
noexcept(++std::declval<basic_iterator &>())
296 && (std::same_as<
decltype(std::declval<base_base_t &>()++),
void>
297 || std::is_nothrow_copy_constructible_v<basic_iterator>))
300 if constexpr (std::same_as<decltype(std::declval<base_base_t &>()++),
void>)
295 constexpr decltype(
auto)
operator++(
int)
noexcept(
noexcept(++std::declval<basic_iterator &>()) {
…}
316 base_t::operator--();
323 noexcept(
noexcept(--std::declval<basic_iterator &>()) && std::is_nothrow_copy_constructible_v<basic_iterator>)
324 requires std::bidirectional_iterator<base_base_t>
333 noexcept(
noexcept(std::declval<base_t &>() += skip))
334 requires std::random_access_iterator<base_base_t>
336 base_t::operator+=(skip);
343 noexcept(
noexcept(std::declval<base_t &>() -= skip))
344 requires std::random_access_iterator<base_base_t>
346 base_t::operator-=(skip);
359 noexcept(!or_throw &&
noexcept(std::declval<base_base_t &>() == std::declval<base_base_t &>()))
360 requires std::forward_iterator<base_base_t>
362 return this->base() == rhs.base();
367 noexcept(!or_throw &&
noexcept(std::declval<base_base_t const &>() == std::declval<sentinel_type const &>()))
372 if (this->base() == rhs)
374 if constexpr (or_throw)
387 noexcept(
noexcept(rhs == lhs))
394 noexcept(
noexcept(std::declval<basic_iterator &>() == rhs))
396 return !(*
this == rhs);
401 noexcept(
noexcept(std::declval<basic_iterator &>() == rhs))
402 requires std::forward_iterator<base_base_t>
404 return !(*
this == rhs);
409 noexcept(
noexcept(rhs != lhs))
425 noexcept(
noexcept(std::declval<base_base_t &>()[0]))
426 requires std::random_access_iterator<base_base_t>
428 return base_t::operator[](n);
440template <
bool or_throw>
452 template <std::ranges::range urng_t>
453 constexpr auto operator()(urng_t && urange,
size_t target_size)
const
455 static_assert(std::ranges::viewable_range<urng_t>,
456 "The views::take adaptor can only be passed viewable_ranges, i.e. Views or &-to-non-View.");
459 if constexpr (std::ranges::sized_range<urng_t>)
461 if constexpr (or_throw)
463 if (target_size > std::ranges::size(urange))
466 "range that is strictly smaller."};
471 target_size = std::min<size_t>(target_size, std::ranges::size(urange));
479 return urange.substr(0, target_size);
482 else if constexpr (is_type_specialisation_of_v<std::remove_cvref_t<urng_t>,
std::basic_string>
483 && std::is_const_v<std::remove_reference_t<urng_t>>)
490 else if constexpr (std::ranges::borrowed_range<urng_t> && std::ranges::contiguous_range<urng_t>
491 && std::ranges::sized_range<urng_t>)
495 return std::span{std::ranges::data(urange), target_size};
498 else if constexpr (std::ranges::borrowed_range<urng_t> && std::ranges::random_access_range<urng_t>
499 && std::ranges::sized_range<urng_t>)
503 return std::ranges::subrange<std::ranges::iterator_t<urng_t>, std::ranges::iterator_t<urng_t>>{
453 constexpr auto operator()(urng_t && urange,
size_t target_size)
const {
…}
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
The forward declared iterator type.
Definition take_exactly_view.hpp:223
basic_iterator()=default
Defaulted.
constexpr basic_iterator(base_base_t it) noexcept(noexcept(base_t{it}))
Constructor that delegates to the CRTP layer.
Definition take_exactly_view.hpp:255
basic_iterator(basic_iterator &&rhs)=default
Defaulted.
constexpr basic_iterator & operator--() noexcept(noexcept(--std::declval< base_base_t & >()))
Decrements the iterator by one.
Definition take_exactly_view.hpp:313
constexpr bool operator!=(sentinel_type const &rhs) const noexcept(noexcept(std::declval< basic_iterator & >()==rhs))
Checks whether *this is not equal to rhs.
Definition take_exactly_view.hpp:393
constexpr basic_iterator & operator-=(difference_type const skip) noexcept(noexcept(std::declval< base_t & >() -=skip))
Advances the iterator by -skip positions.
Definition take_exactly_view.hpp:342
constexpr basic_iterator operator--(int) noexcept(noexcept(--std::declval< basic_iterator & >()) &&std::is_nothrow_copy_constructible_v< basic_iterator >)
Returns an iterator decremented by one.
Definition take_exactly_view.hpp:322
basic_iterator & operator=(basic_iterator const &rhs)=default
Defaulted.
constexpr basic_iterator & operator+=(difference_type const skip) noexcept(noexcept(std::declval< base_t & >()+=skip))
Advances the iterator by skip positions.
Definition take_exactly_view.hpp:332
constexpr friend bool operator!=(sentinel_type const &lhs, basic_iterator const &rhs) noexcept(noexcept(rhs !=lhs))
Checks whether lhs is not equal to rhs.
Definition take_exactly_view.hpp:408
maybe_const_iterator_t< const_range, urng_t > base_base_t
The iterator type of the underlying range.
Definition take_exactly_view.hpp:226
constexpr bool operator==(sentinel_type const &rhs) const noexcept(!or_throw &&noexcept(std::declval< base_base_t const & >()==std::declval< sentinel_type const & >()))
Checks whether lhs is equal to rhs.
Definition take_exactly_view.hpp:366
constexpr bool operator!=(basic_iterator const &rhs) const noexcept(noexcept(std::declval< basic_iterator & >()==rhs))
Checks whether lhs is not equal to rhs.
Definition take_exactly_view.hpp:400
~basic_iterator()=default
Defaulted.
basic_iterator & operator=(basic_iterator &&rhs)=default
Defaulted.
constexpr friend bool operator==(sentinel_type const &lhs, basic_iterator const &rhs) noexcept(noexcept(rhs==lhs))
Checks whether lhs is equal to rhs.
Definition take_exactly_view.hpp:386
std::conditional_t<!std::forward_iterator< base_base_t >, view_take_exactly *, detail::ignore_t > host_ptr
A pointer to host, s.t. the size of the view can shrink on pure input ranges.
Definition take_exactly_view.hpp:240
constexpr basic_iterator & operator++() noexcept(noexcept(++std::declval< base_t & >()))
Increments the iterator by one.
Definition take_exactly_view.hpp:285
constexpr reference operator[](std::make_unsigned_t< difference_type > const n) const noexcept(noexcept(std::declval< base_base_t & >()[0]))
Accesses an element by index.
Definition take_exactly_view.hpp:424
maybe_const_sentinel_t< const_range, urng_t > sentinel_type
The sentinel type is identical to that of the underlying range.
Definition take_exactly_view.hpp:231
constexpr bool operator==(basic_iterator const &rhs) const noexcept(!or_throw &&noexcept(std::declval< base_base_t & >()==std::declval< base_base_t & >()))
Checks whether *this is equal to rhs.
Definition take_exactly_view.hpp:358
constexpr basic_iterator(base_base_t it, size_t const _pos, size_t const _max_pos, view_take_exactly *host=nullptr) noexcept(noexcept(base_t{it}))
Constructor that delegates to the CRTP layer and initialises the members.
Definition take_exactly_view.hpp:259
basic_iterator(basic_iterator const &rhs)=default
Defaulted.
The type returned by seqan3::views::take, seqan3::detail::take_exactly and seqan3::detail::take_exact...
Definition take_exactly_view.hpp:50
size_t target_size
The desired target_size.
Definition take_exactly_view.hpp:56
view_take_exactly & operator=(view_take_exactly const &rhs)=default
Defaulted.
view_take_exactly & operator=(view_take_exactly &&rhs)=default
Defaulted.
view_take_exactly(view_take_exactly const &rhs)=default
Defaulted.
view_take_exactly(view_take_exactly &&rhs)=default
Defaulted.
constexpr auto begin() noexcept
Returns an iterator to the first element of the container.
Definition take_exactly_view.hpp:141
view_take_exactly()=default
Defaulted.
constexpr view_take_exactly(urng_t _urange, size_t const _size)
Construct from another View.
Definition take_exactly_view.hpp:92
~view_take_exactly()=default
Defaulted.
view_take_exactly(urng_t &&, size_t) -> view_take_exactly< std::views::all_t< urng_t >, or_throw >
Template argument type deduction guide that strips references.
constexpr view_take_exactly(rng_t &&_urange, size_t const _size)
Construct from another viewable_range.
Definition take_exactly_view.hpp:120
constexpr auto end() noexcept
Returns an iterator to the element following the last element of the range.
Definition take_exactly_view.hpp:176
urng_t urange
The underlying range.
Definition take_exactly_view.hpp:53
constexpr auto begin() const noexcept
Returns an iterator to the first element of the container.
Definition take_exactly_view.hpp:150
constexpr auto size() const noexcept
Returns the number of elements in the view.
Definition take_exactly_view.hpp:206
constexpr auto end() const noexcept
Returns an iterator to the element following the last element of the range.
Definition take_exactly_view.hpp:185
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
constexpr auto take_exactly_or_throw
A view adaptor that returns the first size elements from the underlying range and also exposes size i...
Definition take_exactly_view.hpp:587
constexpr auto take_exactly
A view adaptor that returns the first size elements from the underlying range (or less if the underly...
Definition take_exactly_view.hpp:573
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 views::take and views::take_or_throw.
Definition take_exactly_view.hpp:442
constexpr auto operator()(size_t const size) const
Store the arguments and return a range adaptor closure object.
Definition take_exactly_view.hpp:444
constexpr auto operator()(urng_t &&urange, size_t target_size) const
Type erase if possible and return view_take_exactly if not.
Definition take_exactly_view.hpp:453
Provides type traits for working with templates.
Additional non-standard concepts for ranges.