17 #ifndef AWALI_MISC_CROSS_HH
18 # define AWALI_MISC_CROSS_HH
27 template <
typename... Sequences>
34 template <std::size_t... I>
38 static constexpr
size_t size =
sizeof...(Sequences);
44 template <
typename Seq>
45 using seq_t =
typename std::remove_reference<Seq>::type;
49 = std::tuple<typename seq_t<Sequences>::value_type...>;
52 : sequences_(sequences)
56 : sequences_(sequences...)
61 = std::tuple<typename seq_t<Sequences>::const_iterator...>;
65 = std::tuple<typename seq_t<Sequences>::iterator...>;
68 template <
typename ValueType,
69 typename IteratorsType>
81 template <
typename OtherValue,
typename OtherIterators>
133 template <std::size_t... I>
137 using swallow =
int[];
142 && std::next(std::get<size-1-I>(
is_)) != std::get<
size-1-I>(
ends_))
151 void reset_up_to_(
int n)
156 template <std::size_t... I>
157 void reset_up_to_(
size_t n, seq<I...>)
159 using swallow =
int[];
163 && ((std::get<I>(
is_) = std::get<I>(
begins_)),
true))...
167 template <std::size_t... I>
170 for (
auto n: {(std::get<I>(
is_) != std::get<I>(that.is_))...})
177 template <std::size_t... I>
223 template <std::size_t... I>
230 template <std::size_t... I>
237 template <std::size_t... I>
240 return {
iterators_t{std::get<I>(sequences_).begin()...},
244 template <std::size_t... I>
247 return {
iterators_t{std::get<I>(sequences_).end()...},
255 template <
typename... Sequences>
256 cross_sequences<Sequences...>
259 return {std::forward<Sequences>(seqs)...};
262 template <
typename... Sequences>
263 cross_sequences<Sequences...>
cross_sequences< Sequences... > cross_tuple(const std::tuple< Sequences... > &seqs)
Definition: cross.hh:264
cross_sequences< Sequences... > cross(Sequences &&... seqs)
Definition: cross.hh:257
Main namespace of Awali.
Definition: ato.hh:22
Composite iterator.
Definition: cross.hh:71
cross_iterator(cross_iterator< OtherValue, OtherIterators > const &that)
Definition: cross.hh:82
IteratorsType iterators_type
Underlying iterators.
Definition: cross.hh:73
iterators_type is_
The current position.
Definition: cross.hh:89
iterators_type begins_
The begins.
Definition: cross.hh:91
value_type operator*() const
Definition: cross.hh:108
iterators_type ends_
The ends.
Definition: cross.hh:93
cross_iterator(const iterators_type &is, const iterators_type &ends)
Definition: cross.hh:75
bool operator!=(const cross_iterator &that) const
Definition: cross.hh:103
cross_iterator & operator++()
Advance to next position.
Definition: cross.hh:96
const_iterator begin() const
Definition: cross.hh:201
std::tuple< Sequences... > sequences_t
Type of the tuple of all the maps.
Definition: cross.hh:31
iterator end()
Definition: cross.hh:217
cross_sequences(const sequences_t &sequences)
Definition: cross.hh:51
cross_sequences(Sequences... sequences)
Definition: cross.hh:55
static constexpr size_t size
Number of sequences.
Definition: cross.hh:38
awali::internal::make_index_sequence< sizeof...(Sequences)> indices_t
Index sequence for our sequences.
Definition: cross.hh:41
const_iterator cbegin() const
Definition: cross.hh:190
cross_iterator< value_type, iterators_t > iterator
Mutable iterator.
Definition: cross.hh:185
typename std::remove_reference< Seq >::type seq_t
The type of the underlying sequences, without reference.
Definition: cross.hh:45
iterator begin()
Definition: cross.hh:211
cross_iterator< const value_type, const_iterators_t > const_iterator
Const iterator.
Definition: cross.hh:188
const_iterator end() const
Definition: cross.hh:206
const_iterator cend() const
Definition: cross.hh:196
std::tuple< typename seq_t< Sequences >::value_type... > value_type
The type of the members.
Definition: cross.hh:49
std::tuple< typename seq_t< Sequences >::const_iterator... > const_iterators_t
Tuple of const_iterators.
Definition: cross.hh:61
std::tuple< typename seq_t< Sequences >::iterator... > iterators_t
Tuple of iterators.
Definition: cross.hh:65