17 #include <type_traits>
25 #if SEQAN3_WITH_CEREAL
26 #include <cereal/types/vector.hpp>
29 namespace seqan3::detail
37 t operator()(t
const && arg)
const
44 t
const & operator()(t
const & arg)
const
103 template <
typename value_type,
bool const_>
104 struct concatenated_sequences_reference_proxy :
106 decltype(std::declval<value_type const &>() | detail::as_const | views::slice(0,1)),
107 decltype(std::declval<value_type &>() | views::slice(0,1))>
112 decltype(std::declval<value_type const &>() | detail::as_const |
views::slice(0,1)),
113 decltype(std::declval<value_type &>() |
views::slice(0,1))>;
116 using base_t::base_t;
119 concatenated_sequences_reference_proxy(base_t && rhs) : base_t{
std::
move(rhs)} {}
122 operator value_type()
const
126 std::ranges::copy(*
this, std::ranges::begin(ret));
182 template <
typename inner_type,
187 std::is_same_v<std::ranges::range_size_t<inner_type>, std::ranges::range_value_t<data_delimiters_type>>
196 data_delimiters_type data_delimiters{0};
216 using reference = detail::concatenated_sequences_reference_proxy<value_type, false>;
223 using const_reference = detail::concatenated_sequences_reference_proxy<value_type, true>;
230 using iterator = detail::random_access_iterator<concatenated_sequences>;
237 using const_iterator = detail::random_access_iterator<concatenated_sequences const>;
251 using size_type = std::ranges::range_size_t<data_delimiters_type>;
256 using allocator_type = void;
267 template <std::ranges::range t>
270 return range_dimension_v<t> == range_dimension_v<value_type> &&
271 std::convertible_to<std::ranges::range_reference_t<t>, std::ranges::range_value_t<value_type>>;
274 static constexpr
bool is_compatible_with_value_type_aux(...)
286 template <std::ranges::range t>
295 template <
typename t>
297 requires is_compatible_with_value_type<std::iter_reference_t<t>>
307 template <std::ranges::range t>
309 requires is_compatible_with_value_type<std::ranges::range_reference_t<t>>
346 template <std::ranges::input_range rng_of_rng_type>
349 requires range_value_t_is_compatible_with_value_type<rng_of_rng_type>
352 if constexpr (std::ranges::sized_range<rng_of_rng_type>)
355 for (
auto && val : rng_of_rng)
357 data_values.insert(data_values.end(), val.begin(), val.end());
358 data_delimiters.push_back(data_delimiters.back() + val.size());
377 template <std::ranges::forward_range rng_type>
380 requires is_compatible_with_value_type<rng_type>
407 template <std::forward_iterator begin_iterator_type,
typename end_iterator_type>
410 requires std::sized_sentinel_for<end_iterator_type, begin_iterator_type> &&
411 iter_value_t_is_compatible_with_value_type<begin_iterator_type>
431 template <std::ranges::forward_range value_type_t = value_type>
433 requires is_compatible_with_value_type<value_type_t>
454 template <std::ranges::forward_range value_type_t>
457 requires is_compatible_with_value_type<value_type_t>
479 template <std::ranges::input_range rng_of_rng_type>
480 void assign(rng_of_rng_type && rng_of_rng)
482 requires range_value_t_is_compatible_with_value_type<rng_of_rng_type>
504 template <std::ranges::forward_range rng_type>
507 requires (is_compatible_with_value_type<rng_type>)
531 template <std::forward_iterator begin_iterator_type,
typename end_iterator_type>
532 void assign(begin_iterator_type begin_it, end_iterator_type end_it)
534 requires iter_value_t_is_compatible_with_value_type<begin_iterator_type> &&
535 std::sized_sentinel_for<end_iterator_type, begin_iterator_type>
556 template <std::ranges::forward_range rng_type = value_type>
559 requires is_compatible_with_value_type<rng_type>
657 throw std::out_of_range{
"Trying to access element behind the last in concatenated_sequences."};
666 throw std::out_of_range{
"Trying to access element behind the last in concatenated_sequences."};
689 return data_values |
views::slice(data_delimiters[i], data_delimiters[i+1]);
696 return data_values | detail::as_const |
views::slice(data_delimiters[i], data_delimiters[i+1]);
743 return (*
this)[
size()-1];
750 return (*
this)[
size()-1];
789 return {data_values, data_delimiters};
798 #ifdef SEQAN3_DEPRECATED_310
851 return data_delimiters.size() - 1;
872 return data_delimiters.max_size() - 1;
894 return data_delimiters.capacity();
921 data_delimiters.reserve(new_cap + 1);
945 data_values.shrink_to_fit();
946 data_delimiters.shrink_to_fit();
968 return data_values.size();
986 return data_values.capacity();
1011 data_values.reserve(new_cap);
1034 data_values.clear();
1035 data_delimiters.clear();
1036 data_delimiters.push_back(0);
1065 template <std::ranges::forward_range rng_type>
1068 requires is_compatible_with_value_type<rng_type>
1071 return insert(pos, 1, std::forward<rng_type>(value));
1101 template <std::ranges::forward_range rng_type>
1104 requires is_compatible_with_value_type<rng_type>
1110 return begin() + pos_as_num;
1122 if constexpr (std::ranges::sized_range<rng_type>)
1125 value_len =
std::distance(std::ranges::begin(value), std::ranges::end(value));
1127 data_values.reserve(data_values.size() +
count * value_len);
1129 | std::views::common;
1131 data_values.insert(data_values.begin() + data_delimiters[pos_as_num],
1132 std::ranges::begin(placeholder),
1133 std::ranges::end(placeholder));
1136 size_t i = data_delimiters[pos_as_num];
1137 for (
size_t j = 0; j <
count; ++j)
1138 for (
auto && v : value)
1139 data_values[i++] = v;
1141 data_delimiters.reserve(data_values.size() +
count);
1142 data_delimiters.insert(data_delimiters.begin() + pos_as_num,
1144 *(data_delimiters.begin() + pos_as_num));
1148 data_delimiters[pos_as_num + i + 1] += value_len * (i + 1);
1153 data_delimiters.end(),
1154 [full_len = value_len *
count] (
auto & d) { d += full_len; });
1156 return begin() + pos_as_num;
1185 template <std::forward_iterator begin_iterator_type,
typename end_iterator_type>
1188 requires iter_value_t_is_compatible_with_value_type<begin_iterator_type> &&
1189 std::sized_sentinel_for<end_iterator_type, begin_iterator_type>
1194 if (last - first == 0)
1195 return begin() + pos_as_num;
1198 std::ranges::subrange<begin_iterator_type, end_iterator_type>(first,
1200 std::ranges::distance(first, last));
1202 data_delimiters.reserve(data_values.size() + ilist.size());
1203 data_delimiters.insert(data_delimiters.begin() + pos_as_num,
1205 *(data_delimiters.begin() + pos_as_num));
1210 for (
size_type i = 0; i < ilist.size(); ++i, ++first)
1212 full_len += std::ranges::distance(*first);
1213 data_delimiters[pos_as_num + 1 + i] += full_len;
1217 auto placeholder =
views::repeat_n(std::ranges::range_value_t<value_type>{}, full_len)
1218 | std::views::common;
1220 data_values.insert(data_values.begin() + data_delimiters[pos_as_num],
1221 std::ranges::begin(placeholder),
1222 std::ranges::end(placeholder));
1225 size_t i = data_delimiters[pos_as_num];
1226 for (
auto && v0 : ilist)
1227 for (
auto && v1 : v0)
1228 data_values[i++] = v1;
1233 std::for_each(data_delimiters.begin() + pos_as_num + ilist.size() + 1,
1234 data_delimiters.end(),
1235 [full_len] (
auto & d) { d += full_len; });
1237 return begin() + pos_as_num;
1261 template <std::ranges::forward_range rng_type>
1264 requires is_compatible_with_value_type<rng_type>
1267 return insert(pos, ilist.begin(), ilist.end());
1294 if (last - first == 0)
1295 return begin() + dist;
1301 for (; first != last; ++first)
1304 data_values.erase(data_values.begin() + data_delimiters[distf],
1305 data_values.begin() + data_delimiters[dist]);
1307 data_delimiters.erase(data_delimiters.begin() + distf + 1,
1308 data_delimiters.begin() + dist + 1);
1313 data_delimiters.end(),
1314 [sum_size] (
auto & d) { d -= sum_size; });
1315 return begin() + dist;
1340 return erase(pos, pos + 1);
1361 template <std::ranges::forward_range rng_type>
1364 requires is_compatible_with_value_type<rng_type>
1367 data_values.insert(data_values.end(), std::ranges::begin(value), std::ranges::end(value));
1392 auto back_length = data_delimiters[
size()] - data_delimiters[
size() - 1];
1393 data_values.resize(data_values.size() - back_length);
1394 data_delimiters.pop_back();
1428 data_delimiters.resize(
count + 1, data_delimiters.back());
1429 data_values.resize(data_delimiters.back());
1437 template <std::ranges::forward_range rng_type>
1440 requires is_compatible_with_value_type<rng_type>
1467 std::swap(data_values, rhs.data_values);
1468 std::swap(data_delimiters, rhs.data_delimiters);
1474 std::swap(data_values, rhs.data_values);
1475 std::swap(data_delimiters, rhs.data_delimiters);
1489 return raw_data() == rhs.raw_data();
1498 return raw_data() != rhs.raw_data();
1507 return raw_data() < rhs.raw_data();
1516 return raw_data() > rhs.raw_data();
1525 return raw_data() <= rhs.raw_data();
1534 return raw_data() >= rhs.raw_data();
1545 template <cereal_archive archive_t>
1546 void CEREAL_SERIALIZE_FUNCTION_NAME(archive_t & archive)
1548 archive(data_values, data_delimiters);
Adaptions of concepts from the Cereal library.
Container that stores sequences concatenated internally.
Definition: concatenated_sequences.hpp:190
std::pair< decltype(data_values) &, decltype(data_delimiters) & > raw_data()
Provides direct, unsafe access to underlying data structures.
Definition: concatenated_sequences.hpp:787
iterator erase(const_iterator first, const_iterator last)
Removes specified elements from the container.
Definition: concatenated_sequences.hpp:1290
size_type max_size() const noexcept
Returns the maximum number of elements the container is able to hold due to system or library impleme...
Definition: concatenated_sequences.hpp:870
void shrink_to_fit()
Requests the removal of unused capacity.
Definition: concatenated_sequences.hpp:943
size_type concat_size() const noexcept
Returns the cumulative size of all elements in the container.
Definition: concatenated_sequences.hpp:966
concatenated_sequences(size_type const count, rng_type &&value)
Construct/assign with count times value.
Definition: concatenated_sequences.hpp:378
constexpr concatenated_sequences & operator=(concatenated_sequences const &)=default
Default constructors.
void assign(rng_of_rng_type &&rng_of_rng)
Construct/assign from a different range.
Definition: concatenated_sequences.hpp:480
constexpr bool operator<(concatenated_sequences const &rhs) const noexcept
Checks whether *this is less than rhs.
Definition: concatenated_sequences.hpp:1505
size_type size() const noexcept
Returns the number of elements in the container, i.e. std::distance(begin(), end()).
Definition: concatenated_sequences.hpp:849
size_type concat_capacity() const noexcept
Returns the concatenated size the container has currently allocated space for.
Definition: concatenated_sequences.hpp:984
void assign(begin_iterator_type begin_it, end_iterator_type end_it)
Construct/assign from pair of iterators.
Definition: concatenated_sequences.hpp:532
iterator end() noexcept
Returns an iterator to the element following the last element of the container.
Definition: concatenated_sequences.hpp:617
constexpr concatenated_sequences(concatenated_sequences &&)=default
Default constructors.
iterator insert(const_iterator pos, rng_type &&value)
Inserts value before position in the container.
Definition: concatenated_sequences.hpp:1066
concatenated_sequences(std::initializer_list< value_type_t > ilist)
Construct/assign from std::initializer_list.
Definition: concatenated_sequences.hpp:435
iterator erase(const_iterator pos)
Removes specified elements from the container.
Definition: concatenated_sequences.hpp:1338
const_reference concat() const
Return the concatenation of all members.
Definition: concatenated_sequences.hpp:775
reference front()
Return the first element as a view. Calling front on an empty container is undefined.
Definition: concatenated_sequences.hpp:713
constexpr bool operator>=(concatenated_sequences const &rhs) const noexcept
Checks whether *this is greater than or equal to rhs.
Definition: concatenated_sequences.hpp:1532
constexpr concatenated_sequences(concatenated_sequences const &)=default
Default constructors.
constexpr bool operator==(concatenated_sequences const &rhs) const noexcept
Checks whether *this is equal to rhs.
Definition: concatenated_sequences.hpp:1487
static constexpr bool iter_value_t_is_compatible_with_value_type
Whether a type is compatible with this class.
Definition: concatenated_sequences.hpp:299
reference at(size_type const i)
Return the i-th element as a view.
Definition: concatenated_sequences.hpp:653
const_reference front() const
Return the first element as a view. Calling front on an empty container is undefined.
Definition: concatenated_sequences.hpp:720
constexpr void swap(concatenated_sequences &rhs) noexcept
Swap contents with another instance.
Definition: concatenated_sequences.hpp:1465
constexpr void swap(concatenated_sequences &&rhs) noexcept
Swap contents with another instance.
Definition: concatenated_sequences.hpp:1472
concatenated_sequences()=default
Default constructors.
const_reference operator[](size_type const i) const
Return the i-th element as a view.
Definition: concatenated_sequences.hpp:693
void resize(size_type const count)
Resizes the container to contain count elements.
Definition: concatenated_sequences.hpp:1425
std::pair< decltype(data_values) const &, decltype(data_delimiters) const & > raw_data() const
Provides direct, unsafe access to underlying data structures.
Definition: concatenated_sequences.hpp:793
static constexpr bool range_value_t_is_compatible_with_value_type
Whether a type is compatible with this class.
Definition: concatenated_sequences.hpp:311
const_iterator end() const noexcept
Returns an iterator to the element following the last element of the container.
Definition: concatenated_sequences.hpp:623
void push_back(rng_type &&value)
Appends the given element value to the end of the container.
Definition: concatenated_sequences.hpp:1362
bool empty() const noexcept
Checks whether the container is empty.
Definition: concatenated_sequences.hpp:831
constexpr bool operator!=(concatenated_sequences const &rhs) const noexcept
Checks whether *this is not equal to rhs.
Definition: concatenated_sequences.hpp:1496
const_iterator begin() const noexcept
Returns an iterator to the first element of the container.
Definition: concatenated_sequences.hpp:591
iterator begin() noexcept
Returns an iterator to the first element of the container.
Definition: concatenated_sequences.hpp:585
detail::concatenated_sequences_reference_proxy< value_type, false > reference
A proxy of type views::slice that represents the range on the concatenated vector.
Definition: concatenated_sequences.hpp:216
std::ranges::range_size_t< data_delimiters_type > size_type
An unsigned integer type (usually std::size_t)
Definition: concatenated_sequences.hpp:251
const_reference back() const
Return the last element as a view.
Definition: concatenated_sequences.hpp:747
concatenated_sequences(begin_iterator_type begin_it, end_iterator_type end_it)
Construct/assign from pair of iterators.
Definition: concatenated_sequences.hpp:408
~concatenated_sequences()=default
Default constructors.
reference back()
Return the last element as a view.
Definition: concatenated_sequences.hpp:740
void assign(size_type const count, rng_type &&value)
Construct/assign with count times value.
Definition: concatenated_sequences.hpp:505
detail::concatenated_sequences_reference_proxy< value_type, true > const_reference
An immutable proxy of type views::slice that represents the range on the concatenated vector.
Definition: concatenated_sequences.hpp:223
constexpr bool operator>(concatenated_sequences const &rhs) const noexcept
Checks whether *this is greater than rhs.
Definition: concatenated_sequences.hpp:1514
void clear() noexcept
Removes all elements from the container.
Definition: concatenated_sequences.hpp:1032
const_iterator cend() const noexcept
Returns an iterator to the element following the last element of the container.
Definition: concatenated_sequences.hpp:629
size_type capacity() const noexcept
Returns the number of elements that the container has currently allocated space for.
Definition: concatenated_sequences.hpp:892
detail::random_access_iterator< concatenated_sequences const > const_iterator
The const iterator type of this container (a random access iterator).
Definition: concatenated_sequences.hpp:237
std::pair< decltype(data_values) const &, decltype(data_delimiters) const & > data() const
Provides direct, unsafe access to underlying data structures.
Definition: concatenated_sequences.hpp:808
iterator insert(const_iterator pos, std::initializer_list< rng_type > const &ilist)
Inserts elements from initializer list before position in the container.
Definition: concatenated_sequences.hpp:1262
const_iterator cbegin() const noexcept
Returns an iterator to the first element of the container.
Definition: concatenated_sequences.hpp:597
std::ranges::range_difference_t< data_delimiters_type > difference_type
A signed integer type (usually std::ptrdiff_t)
Definition: concatenated_sequences.hpp:244
iterator insert(const_iterator pos, begin_iterator_type first, end_iterator_type last)
Inserts elements from range [first, last) before position in the container.
Definition: concatenated_sequences.hpp:1186
detail::random_access_iterator< concatenated_sequences > iterator
The iterator type of this container (a random access iterator).
Definition: concatenated_sequences.hpp:230
const_reference at(size_type const i) const
Return the i-th element as a view.
Definition: concatenated_sequences.hpp:662
void resize(size_type const count, rng_type &&value)
Resizes the container to contain count elements.
Definition: concatenated_sequences.hpp:1438
concatenated_sequences & operator=(std::initializer_list< value_type_t > ilist)
Construct/assign from std::initializer_list.
Definition: concatenated_sequences.hpp:455
std::pair< decltype(data_values) &, decltype(data_delimiters) & > data()
Provides direct, unsafe access to underlying data structures.
Definition: concatenated_sequences.hpp:801
iterator insert(const_iterator pos, size_type const count, rng_type &&value)
Inserts count copies of value before position in the container.
Definition: concatenated_sequences.hpp:1102
void concat_reserve(size_type const new_cap)
Increase the concat_capacity() to a value that's greater or equal to new_cap.
Definition: concatenated_sequences.hpp:1009
static constexpr bool is_compatible_with_value_type
Whether a type is compatible with this class's value_type or reference type.
Definition: concatenated_sequences.hpp:287
void pop_back()
Removes the last element of the container.
Definition: concatenated_sequences.hpp:1389
reference concat()
Return the concatenation of all members.
Definition: concatenated_sequences.hpp:769
concatenated_sequences(rng_of_rng_type &&rng_of_rng)
Construct/assign from a different range.
Definition: concatenated_sequences.hpp:347
void reserve(size_type const new_cap)
Increase the capacity to a value that's greater or equal to new_cap.
Definition: concatenated_sequences.hpp:919
void assign(std::initializer_list< rng_type > ilist)
Construct/assign from std::initializer_list.
Definition: concatenated_sequences.hpp:557
constexpr concatenated_sequences & operator=(concatenated_sequences &&)=default
Default constructors.
reference operator[](size_type const i)
Return the i-th element as a view.
Definition: concatenated_sequences.hpp:686
constexpr bool operator<=(concatenated_sequences const &rhs) const noexcept
Checks whether *this is less than or equal to rhs.
Definition: concatenated_sequences.hpp:1523
decltype(detail::transform< trait_t >(list_t{})) transform
Apply a transformation trait to every type in the list and return a seqan3::type_list of the results.
Definition: traits.hpp:471
constexpr ptrdiff_t count
Count the occurrences of a type in a pack.
Definition: traits.hpp:169
constexpr size_t size
The size of a type pack.
Definition: traits.hpp:151
constexpr auto slice
A view adaptor that returns a half-open interval on the underlying range.
Definition: slice.hpp:189
constexpr auto repeat_n
A view factory that repeats a given value n times.
Definition: repeat_n.hpp:95
auto const move
A view that turns lvalue-references into rvalue-references.
Definition: move.hpp:74
A more refined container concept than seqan3::random_access_container.
Provides C++20 additions to the <iterator> header.
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:29
SeqAn specific customisations in the standard namespace.
Adaptations of concepts from the Ranges TS.
Adaptations of concepts from the standard library.
Provides seqan3::views::repeat_n.
Provides seqan3::views::slice.