15 #include <range/v3/algorithm/copy.hpp>
29 namespace seqan3::detail
47 template <std::ranges::input_range urng_t>
48 class view_persist :
public std::ranges::view_interface<view_persist<urng_t>>
58 using reference = reference_t<urng_t>;
61 using const_reference = reference;
63 using value_type = value_type_t<urng_t>;
65 using size_type = detail::transformation_trait_or_t<seqan3::size_type<urng_t>,
void>;
67 using difference_type = difference_type_t<urng_t>;
69 using iterator = std::ranges::iterator_t<urng_t>;
71 using const_iterator = iterator;
77 view_persist() noexcept = default;
78 constexpr view_persist(view_persist const & rhs) noexcept = default;
79 constexpr view_persist(view_persist && rhs) noexcept = default;
80 constexpr view_persist & operator=(view_persist const & rhs) noexcept = default;
81 constexpr view_persist & operator=(view_persist && rhs) noexcept = default;
82 ~view_persist() noexcept = default;
87 view_persist(urng_t && _urange) :
108 const_iterator
begin() const noexcept
110 return seqan3::begin(*urange);
114 const_iterator
cbegin() const noexcept
132 auto end() const noexcept
134 return seqan3::end(*urange);
138 auto cend() const noexcept
147 template <
typename urng_t>
148 view_persist(urng_t &&) -> view_persist<std::remove_reference_t<urng_t>>;
157 class persist_fn :
public adaptor_base<persist_fn>
161 using base_t = adaptor_base<persist_fn>;
165 using base_t::base_t;
174 template <std::ranges::viewable_range urng_t>
175 static auto impl(urng_t && urange)
183 template <std::ranges::range urng_t>
184 static auto impl(urng_t && urange)
186 static_assert(!std::is_lvalue_reference_v<urng_t>,
"BUG: lvalue-reference in persist_fn::impl().");
248 inline auto constexpr
persist = detail::persist_fn{};