|
SeqAn3
3.0.1
The Modern C++ library for sequence analysis.
|
|
Go to the documentation of this file.
15 #include <type_traits>
30 #if SEQAN3_WITH_CEREAL
31 #include <cereal/types/vector.hpp>
34 namespace seqan3::detail
49 template <
typename value_type,
bool const_>
50 struct concatenated_sequences_reference_proxy :
52 decltype(std::declval<value_type const &>() | views::as_const | views::slice(0,1)),
53 decltype(std::declval<value_type &>() | views::slice(0,1))>
59 decltype(std::declval<value_type &>() |
views::slice(0,1))>;
65 concatenated_sequences_reference_proxy(base_t && rhs) : base_t{
std::move(rhs)} {}
68 operator value_type()
const
72 std::ranges::copy(*
this, std::ranges::begin(ret));
126 template <
typename inner_type,
131 std::is_same_v<size_type_t<inner_type>, value_type_t<data_delimiters_type>>
140 data_delimiters_type data_delimiters{0};
153 using reference = detail::concatenated_sequences_reference_proxy<value_type, false>;
157 using const_reference = detail::concatenated_sequences_reference_proxy<value_type, true>;
161 using iterator = detail::random_access_iterator<concatenated_sequences>;
165 using const_iterator = detail::random_access_iterator<concatenated_sequences const>;
178 using allocator_type = void;
189 template <
typename t>
191 std::is_same_v<remove_cvref_t<t>,
reference> ||
193 (dimension_v<t> == dimension_v<value_type> &&
199 template <
typename t>
200 requires (dimension_v<t> == dimension_v<value_type> + 1) &&
201 is_compatible_value<reference_t<t>>
202 static constexpr
bool is_compatible_this_aux =
true;
208 template <
typename t>
211 std::is_same_v<remove_cvref_t<t>,
iterator> ||
243 template <std::ranges::input_range rng_of_rng_type>
246 requires is_compatible_this<rng_of_rng_type>
249 if constexpr (std::ranges::sized_range<rng_of_rng_type>)
252 for (
auto && val : rng_of_rng)
254 data_values.insert(data_values.end(), val.begin(), val.end());
255 data_delimiters.push_back(data_delimiters.back() + val.size());
272 template <std::ranges::forward_range rng_type>
275 requires is_compatible_value<rng_type>
300 template <std::forward_iterator begin_iterator_type,
typename end_iterator_type>
303 requires std::sized_sentinel_for<end_iterator_type, begin_iterator_type> &&
304 is_compatible_this<begin_iterator_type>
322 template <std::ranges::forward_range rng_type = value_type>
325 requires is_compatible_value<rng_type>
343 template <std::ranges::forward_range rng_type>
346 requires is_compatible_value<rng_type>
365 template <std::ranges::input_range rng_of_rng_type>
366 void assign(rng_of_rng_type && rng_of_rng)
368 requires is_compatible_this<rng_of_rng_type>
388 template <
typename rng_type>
391 requires (std::ranges::forward_range<rng_type> && is_compatible_value<rng_type>)
412 template <std::forward_iterator begin_iterator_type,
typename end_iterator_type>
413 void assign(begin_iterator_type begin_it, end_iterator_type end_it)
415 requires is_compatible_this<begin_iterator_type> &&
416 std::sized_sentinel_for<end_iterator_type, begin_iterator_type>
435 template <std::ranges::forward_range rng_type = value_type>
438 requires is_compatible_value<rng_type>
530 throw std::out_of_range{
"Trying to access element behind the last in concatenated_sequences."};
539 throw std::out_of_range{
"Trying to access element behind the last in concatenated_sequences."};
560 return data_values |
views::slice(data_delimiters[i], data_delimiters[i+1]);
610 return (*
this)[
size()-1];
617 return (*
this)[
size()-1];
656 return {data_values, data_delimiters};
712 return data_delimiters.size() - 1;
731 return data_delimiters.max_size() - 1;
751 return data_delimiters.capacity();
778 data_delimiters.reserve(new_cap + 1);
802 data_values.shrink_to_fit();
803 data_delimiters.shrink_to_fit();
823 return data_values.size();
839 return data_values.capacity();
862 data_values.reserve(new_cap);
884 data_delimiters.clear();
885 data_delimiters.push_back(0);
912 template <std::ranges::forward_range rng_type>
914 requires is_compatible_value<rng_type>
916 return insert(pos, 1, std::forward<rng_type>(value));
944 template <std::ranges::forward_range rng_type>
946 requires is_compatible_value<rng_type>
952 return begin() + pos_as_num;
964 if constexpr (std::ranges::sized_range<rng_type>)
967 value_len =
std::distance(seqan3::begin(value), seqan3::end(value));
969 data_values.reserve(data_values.size() +
count * value_len);
971 | std::views::common;
973 data_values.insert(data_values.begin() + data_delimiters[pos_as_num],
974 seqan3::begin(placeholder),
975 seqan3::end(placeholder));
978 size_t i = data_delimiters[pos_as_num];
979 for (
size_t j = 0; j <
count; ++j)
980 for (
auto && v : value)
981 data_values[i++] = v;
983 data_delimiters.reserve(data_values.size() +
count);
984 data_delimiters.insert(data_delimiters.begin() + pos_as_num,
986 *(data_delimiters.begin() + pos_as_num));
990 data_delimiters[pos_as_num + i + 1] += value_len * (i + 1);
995 data_delimiters.end(),
996 [full_len = value_len *
count] (
auto & d) { d += full_len; });
998 return begin() + pos_as_num;
1024 template <std::forward_iterator begin_iterator_type,
typename end_iterator_type>
1027 requires is_compatible_this<begin_iterator_type> &&
1028 std::sized_sentinel_for<end_iterator_type, begin_iterator_type>
1033 if (last - first == 0)
1034 return begin() + pos_as_num;
1037 std::ranges::subrange<begin_iterator_type, end_iterator_type>(first,
1039 std::ranges::distance(first, last));
1041 data_delimiters.reserve(data_values.size() + ilist.size());
1042 data_delimiters.insert(data_delimiters.begin() + pos_as_num,
1044 *(data_delimiters.begin() + pos_as_num));
1049 for (
size_type i = 0; i < ilist.size(); ++i, ++first)
1051 full_len += std::ranges::distance(*first);
1052 data_delimiters[pos_as_num + 1 + i] += full_len;
1057 | std::views::common;
1059 data_values.insert(data_values.begin() + data_delimiters[pos_as_num],
1060 seqan3::begin(placeholder),
1061 seqan3::end(placeholder));
1064 size_t i = data_delimiters[pos_as_num];
1065 for (
auto && v0 : ilist)
1066 for (
auto && v1 : v0)
1067 data_values[i++] = v1;
1072 std::for_each(data_delimiters.begin() + pos_as_num + ilist.size() + 1,
1073 data_delimiters.end(),
1074 [full_len] (
auto & d) { d += full_len; });
1076 return begin() + pos_as_num;
1098 template <std::ranges::forward_range rng_type>
1100 requires is_compatible_value<rng_type>
1102 return insert(pos, ilist.begin(), ilist.end());
1127 if (last - first == 0)
1128 return begin() + dist;
1134 for (; first != last; ++first)
1137 data_values.erase(data_values.begin() + data_delimiters[distf],
1138 data_values.begin() + data_delimiters[dist]);
1140 data_delimiters.erase(data_delimiters.begin() + distf + 1,
1141 data_delimiters.begin() + dist + 1);
1146 data_delimiters.end(),
1147 [sum_size] (
auto & d) { d -= sum_size; });
1148 return begin() + dist;
1171 return erase(pos, pos + 1);
1190 template <std::ranges::forward_range rng_type>
1192 requires is_compatible_value<rng_type>
1194 data_values.insert(data_values.end(), seqan3::begin(value), seqan3::end(value));
1195 data_delimiters.push_back(data_delimiters.back() +
seqan3::size(value));
1217 auto back_length = data_delimiters[
size()] - data_delimiters[
size() - 1];
1218 data_values.resize(data_values.size() - back_length);
1219 data_delimiters.pop_back();
1251 data_delimiters.resize(
count + 1, data_delimiters.back());
1252 data_values.resize(data_delimiters.back());
1260 template <std::ranges::forward_range rng_type>
1262 requires is_compatible_value<rng_type>
1286 std::swap(data_values, rhs.data_values);
1287 std::swap(data_delimiters, rhs.data_delimiters);
1293 std::swap(data_values, rhs.data_values);
1294 std::swap(data_delimiters, rhs.data_delimiters);
1305 return raw_data() == rhs.raw_data();
1311 return raw_data() != rhs.raw_data();
1317 return raw_data() < rhs.raw_data();
1323 return raw_data() > rhs.raw_data();
1329 return raw_data() <= rhs.raw_data();
1335 return raw_data() >= rhs.raw_data();
1346 template <cereal_archive archive_t>
1347 void CEREAL_SERIALIZE_FUNCTION_NAME(archive_t & archive)
1349 archive(data_values, data_delimiters);
A more refined container concept than seqan3::random_access_container.
Provides seqan3::views::as_const.
typename difference_type< t >::type difference_type_t
Shortcut for seqan3::difference_type (transformation_trait shortcut).
Definition: pre.hpp:166
size_type concat_size() const noexcept
Returns the cumulative size of all elements in the container.
Definition: concatenated_sequences.hpp:821
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:153
reference at(size_type const i)
Return the i-th element as a view.
Definition: concatenated_sequences.hpp:526
constexpr concatenated_sequences & operator=(concatenated_sequences const &)=default
Default constructors.
reference back()
Return the last element as a view.
Definition: concatenated_sequences.hpp:607
Provides various shortcuts for common std::ranges functions.
bool empty() const noexcept
Checks whether the container is empty.
Definition: concatenated_sequences.hpp:694
concatenated_sequences(rng_of_rng_type &&rng_of_rng)
Construct/assign from a different range.
Definition: concatenated_sequences.hpp:244
void shrink_to_fit()
Requests the removal of unused capacity.
Definition: concatenated_sequences.hpp:800
constexpr bool operator==(concatenated_sequences const &rhs) const noexcept
Checks whether *this is equal to rhs.
Definition: concatenated_sequences.hpp:1303
size_type capacity() const noexcept
Returns the number of elements that the container has currently allocated space for.
Definition: concatenated_sequences.hpp:749
const_iterator cbegin() const noexcept
Returns an iterator to the first element of the container.
Definition: concatenated_sequences.hpp:474
detail::random_access_iterator< concatenated_sequences const > const_iterator
The const iterator type of this container (a random access iterator).
Definition: concatenated_sequences.hpp:165
const_iterator end() const noexcept
Returns an iterator to the element following the last element of the container.
Definition: concatenated_sequences.hpp:498
iterator end() noexcept
Returns an iterator to the element following the last element of the container.
Definition: concatenated_sequences.hpp:492
Provides various type traits.
size_type_t< data_delimiters_type > size_type
An unsigned integer type (usually std::size_t)
Definition: concatenated_sequences.hpp:173
iterator erase(const_iterator pos)
Removes specified elements from the container.
Definition: concatenated_sequences.hpp:1169
constexpr void swap(concatenated_sequences &rhs) noexcept
Swap contents with another instance.
Definition: concatenated_sequences.hpp:1284
constexpr void swap(concatenated_sequences &&rhs) noexcept
Swap contents with another instance.
Definition: concatenated_sequences.hpp:1291
detail::random_access_iterator< concatenated_sequences > iterator
The iterator type of this container (a random access iterator).
Definition: concatenated_sequences.hpp:161
concatenated_sequences(std::initializer_list< rng_type > ilist)
Construct/assign from std::initializer_list.
Definition: concatenated_sequences.hpp:323
Provides C++20 additions to the <iterator> header.
void clear() noexcept
Removes all elements from the container.
Definition: concatenated_sequences.hpp:881
const auto move
A view that turns lvalue-references into rvalue-references.
Definition: move.hpp:68
typename size_type< t >::type size_type_t
Shortcut for seqan3::size_type (transformation_trait shortcut).
Definition: pre.hpp:195
const_reference concat() const
Return the concatenation of all members.
Definition: concatenated_sequences.hpp:640
Adaptations of concepts from the standard library.
constexpr bool operator>=(concatenated_sequences const &rhs) const noexcept
Checks whether *this is greater than or equal to rhs.
Definition: concatenated_sequences.hpp:1333
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:157
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:776
void pop_back()
Removes the last element of the container.
Definition: concatenated_sequences.hpp:1214
void resize(size_type const count, rng_type &&value) requires is_compatible_value< rng_type >
Resizes the container to contain count elements.
Definition: concatenated_sequences.hpp:1261
concatenated_sequences()=default
Default constructors.
void resize(size_type const count)
Resizes the container to contain count elements.
Definition: concatenated_sequences.hpp:1248
constexpr bool operator<=(concatenated_sequences const &rhs) const noexcept
Checks whether *this is less than or equal to rhs.
Definition: concatenated_sequences.hpp:1327
iterator erase(const_iterator first, const_iterator last)
Removes specified elements from the container.
Definition: concatenated_sequences.hpp:1123
Provides the seqan3::detail::random_access_iterator class.
void assign(size_type const count, rng_type &&value)
Construct/assign with count times value.
Definition: concatenated_sequences.hpp:389
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:860
iterator insert(const_iterator pos, std::initializer_list< rng_type > const &ilist) requires is_compatible_value< rng_type >
Inserts elements from initializer list before position in the container.
Definition: concatenated_sequences.hpp:1099
const_iterator begin() const noexcept
Returns an iterator to the first element of the container.
Definition: concatenated_sequences.hpp:468
Provides seqan3::views::slice.
Provides seqan3::views::repeat_n.
void push_back(rng_type &&value) requires is_compatible_value< rng_type >
Appends the given element value to the end of the container.
Definition: concatenated_sequences.hpp:1191
Container that stores sequences concatenated internally.
Definition: concatenated_sequences.hpp:133
const_iterator cend() const noexcept
Returns an iterator to the element following the last element of the container.
Definition: concatenated_sequences.hpp:504
typename value_type< t >::type value_type_t
Shortcut for seqan3::value_type (transformation_trait shortcut).
Definition: pre.hpp:48
iterator begin() noexcept
Returns an iterator to the first element of the container.
Definition: concatenated_sequences.hpp:462
reference concat()
Return the concatenation of all members.
Definition: concatenated_sequences.hpp:634
The main SeqAn3 namespace.
Definition: aligned_sequence_concept.hpp:36
static constexpr bool is_compatible_value
Whether a type satisfies seqan3::compatible with this class's value_type or reference type.
Definition: concatenated_sequences.hpp:190
reference operator[](size_type const i)
Return the i-th element as a view.
Definition: concatenated_sequences.hpp:557
const_reference at(size_type const i) const
Return the i-th element as a view.
Definition: concatenated_sequences.hpp:535
The concept std::convertible_to<From, To> specifies that an expression of the type and value category...
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:729
concatenated_sequences & operator=(std::initializer_list< rng_type > ilist)
Construct/assign from std::initializer_list.
Definition: concatenated_sequences.hpp:344
const_reference back() const
Return the last element as a view.
Definition: concatenated_sequences.hpp:614
concatenated_sequences(size_type const count, rng_type &&value)
Construct/assign with count times value.
Definition: concatenated_sequences.hpp:273
static constexpr bool is_compatible_this
Whether a type satisfies seqan3::compatible with this class.
Definition: concatenated_sequences.hpp:209
std::pair< decltype(data_values) const &, decltype(data_delimiters) const & > data() const
Provides direct, unsafe access to underlying data structures.
Definition: concatenated_sequences.hpp:674
constexpr size_t size
The size of a type pack.
Definition: traits.hpp:116
Provides seqan3::views::join.
Adaptations of concepts from the Ranges TS.
size_type concat_capacity() const noexcept
Returns the concatenated size the container has currently allocated space for.
Definition: concatenated_sequences.hpp:837
const_reference front() const
Return the first element as a view. Calling front on an empty container is undefined.
Definition: concatenated_sequences.hpp:589
const_reference operator[](size_type const i) const
Return the i-th element as a view.
Definition: concatenated_sequences.hpp:564
size_type size() const noexcept
Returns the number of elements in the container, i.e. std::distance(begin(), end()).
Definition: concatenated_sequences.hpp:710
~concatenated_sequences()=default
Default constructors.
constexpr auto slice
A view adaptor that returns a half-open interval on the underlying range.
Definition: slice.hpp:141
void assign(begin_iterator_type begin_it, end_iterator_type end_it)
Construct/assign from pair of iterators.
Definition: concatenated_sequences.hpp:413
reference front()
Return the first element as a view. Calling front on an empty container is undefined.
Definition: concatenated_sequences.hpp:582
constexpr bool operator<(concatenated_sequences const &rhs) const noexcept
Checks whether *this is less than rhs.
Definition: concatenated_sequences.hpp:1315
concatenated_sequences(begin_iterator_type begin_it, end_iterator_type end_it)
Construct/assign from pair of iterators.
Definition: concatenated_sequences.hpp:301
difference_type_t< data_delimiters_type > difference_type
A signed integer type (usually std::ptrdiff_t)
Definition: concatenated_sequences.hpp:169
Adaptions of concepts from the Cereal library.
constexpr auto repeat_n
A view factory that repeats a given value n times.
Definition: repeat_n.hpp:94
std::pair< decltype(data_values) &, decltype(data_delimiters) & > raw_data()
Provides direct, unsafe access to underlying data structures.
Definition: concatenated_sequences.hpp:654
void assign(std::initializer_list< rng_type > ilist)
Construct/assign from std::initializer_list.
Definition: concatenated_sequences.hpp:436
void assign(rng_of_rng_type &&rng_of_rng)
Construct/assign from a different range.
Definition: concatenated_sequences.hpp:366
iterator insert(const_iterator pos, rng_type &&value) requires is_compatible_value< rng_type >
Inserts value before position in the container.
Definition: concatenated_sequences.hpp:913
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:1025
constexpr bool operator>(concatenated_sequences const &rhs) const noexcept
Checks whether *this is greater than rhs.
Definition: concatenated_sequences.hpp:1321
std::pair< decltype(data_values) &, decltype(data_delimiters) & > data()
Provides direct, unsafe access to underlying data structures.
Definition: concatenated_sequences.hpp:667
const auto as_const
A view that provides only const & to elements of the underlying range.
Definition: as_const.hpp:87
iterator insert(const_iterator pos, size_type const count, rng_type &&value) requires is_compatible_value< rng_type >
Inserts count copies of value before position in the container.
Definition: concatenated_sequences.hpp:945
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:660
constexpr ptrdiff_t count
Count the occurrences of a type in a pack.
Definition: traits.hpp:134
constexpr bool operator!=(concatenated_sequences const &rhs) const noexcept
Checks whether *this is not equal to rhs.
Definition: concatenated_sequences.hpp:1309