15 #include <range/v3/view/single.hpp>
22 namespace seqan3::detail
43 template <std::copy_constructible value_t>
44 class repeat_view :
public std::ranges::view_interface<repeat_view<value_t>>
48 using base_t = std::ranges::view_interface<repeat_view<value_t>>;
51 using sentinel_type = std::ranges::default_sentinel_t;
54 template <
typename parent_type>
55 class repeat_view_iterator :
public detail::random_access_iterator_base<parent_type, repeat_view_iterator>
58 using base_t = detail::random_access_iterator_base<parent_type, repeat_view_iterator>;
61 using typename base_t::position_type;
65 using typename base_t::difference_type;
67 using typename base_t::value_type;
69 using typename base_t::reference;
71 using typename base_t::pointer;
73 using typename base_t::iterator_category;
78 constexpr repeat_view_iterator() =
default;
79 constexpr repeat_view_iterator(repeat_view_iterator
const &) =
default;
80 constexpr repeat_view_iterator & operator=(repeat_view_iterator
const &) =
default;
81 constexpr repeat_view_iterator (repeat_view_iterator &&) =
default;
82 constexpr repeat_view_iterator & operator=(repeat_view_iterator &&) =
default;
83 ~repeat_view_iterator() =
default;
88 explicit constexpr repeat_view_iterator(parent_type & host) noexcept : base_t{host} {}
93 template <
typename parent_type2>
95 requires std::is_const_v<parent_type> && !std::is_const_v<parent_type2> &&
96 std::is_same_v<std::remove_const_t<parent_type>, parent_type2>
98 constexpr repeat_view_iterator(repeat_view_iterator<parent_type2>
const & rhs) noexcept :
106 using base_t::operator==;
109 using base_t::operator!=;
112 constexpr
bool operator==(std::ranges::default_sentinel_t
const &)
const noexcept
118 constexpr
bool operator!=(std::ranges::default_sentinel_t
const &)
const noexcept
124 friend constexpr
bool operator==(std::ranges::default_sentinel_t
const &,
125 repeat_view_iterator
const &) noexcept
131 friend constexpr
bool operator!=(std::ranges::default_sentinel_t
const &,
132 repeat_view_iterator
const &) noexcept
146 using reference = value_type &;
148 using const_reference = value_type
const &;
150 using size_type = void;
152 using difference_type = ptrdiff_t;
154 using iterator = repeat_view_iterator<repeat_view>;
156 using const_iterator = repeat_view_iterator<repeat_view const>;
162 constexpr repeat_view() =
default;
163 constexpr repeat_view(repeat_view
const &) =
default;
164 constexpr repeat_view & operator=(repeat_view
const &) =
default;
165 constexpr repeat_view(repeat_view &&) =
default;
166 constexpr repeat_view & operator=(repeat_view &&) =
default;
167 ~repeat_view() =
default;
170 constexpr
explicit repeat_view(value_t
const & value) : single_value{ranges::single_view{value}}
174 constexpr
explicit repeat_view(value_t && value) : single_value{ranges::single_view{
std::move(value)}}
196 constexpr iterator
begin() noexcept
198 return iterator{*
this};
202 constexpr const_iterator
begin() const noexcept
204 return const_iterator{*
this};
208 constexpr const_iterator
cbegin() const noexcept
210 return const_iterator{*
this};
228 constexpr sentinel_type
end() noexcept
234 constexpr sentinel_type
end() const noexcept
240 constexpr sentinel_type
cend() const noexcept
265 constexpr const_reference operator[](difference_type
const SEQAN3_DOXYGEN_ONLY(n))
const noexcept
267 return *single_value.begin();
271 constexpr reference operator[](difference_type
const SEQAN3_DOXYGEN_ONLY(n)) noexcept
273 return *single_value.begin();
290 template <std::copy_constructible value_type>
291 constexpr
auto operator()(value_type && value)
const
293 return detail::repeat_view{std::forward<value_type>(value)};
350 constexpr
inline detail::repeat_fn
repeat{};