IgANet
IgANets - Isogeometric Analysis Networks
Loading...
Searching...
No Matches
zip.hpp
Go to the documentation of this file.
1
15#pragma once
16
17#include <tuple>
18#include <utility>
19
20namespace iganet {
21namespace utils {
22namespace detail {
23
24template <typename... T> class zip_helper {
25public:
26 class iterator {
27 public:
28 using iterator_category = std::forward_iterator_tag;
29 using value_type = std::tuple<decltype(*std::declval<T>().begin())...>;
30 using difference_type = std::tuple<decltype(*std::declval<T>().begin())...>;
31 using pointer = std::tuple<decltype(*std::declval<T>().begin())...> *;
32 using reference = std::tuple<decltype(*std::declval<T>().begin())...> &;
33
34 private:
35 std::tuple<decltype(std::declval<T>().begin())...> _iterators;
36
37 template <std::size_t... I> auto deref(std::index_sequence<I...>) const {
38 return typename iterator::value_type{*std::get<I>(_iterators)...};
39 }
40
41 template <std::size_t... I> void increment(std::index_sequence<I...>) {
42 auto l = {(++std::get<I>(_iterators), 0)...};
43 }
44
45 public:
46 explicit iterator(decltype(_iterators) iterators)
48
50 increment(std::index_sequence_for<T...>{});
51 return *this;
52 }
53
55 auto saved{*this};
56 increment(std::index_sequence_for<T...>{});
57 return saved;
58 }
59
60 bool operator!=(const iterator &other) const {
61 return _iterators != other._iterators;
62 }
63
64 auto operator*() const { return deref(std::index_sequence_for<T...>{}); }
65 };
66
68 : _seqs(seqs...),
71 _end{make_tuple_end(_seqs,
72 std::make_index_sequence<sizeof...(seqs)>{})} {}
73
74 iterator begin() const { return _begin; }
75 iterator end() const { return _end; }
76
77private:
78 template <typename Tuple, std::size_t... Is>
79 auto constexpr make_tuple_begin(Tuple &&t, std::index_sequence<Is...>) {
80 return std::make_tuple(std::get<Is>(t).begin()...);
81 }
82
83 template <typename Tuple, std::size_t... Is>
84 auto constexpr make_tuple_end(Tuple &&t, std::index_sequence<Is...>) {
85 return std::make_tuple(std::get<Is>(t).end()...);
86 }
87
88private:
89 std::tuple<T...> _seqs;
92};
93
94} // namespace detail
95
96// Sequences must be the same length.
97template <typename... T> auto zip(T &&...seqs) {
98 return iganet::utils::detail::zip_helper<T...>(std::forward<T>(seqs)...);
99}
100
101} // namespace utils
102} // namespace iganet
std::tuple< decltype(*std::declval< T >().begin())... > & reference
Definition zip.hpp:32
std::forward_iterator_tag iterator_category
Definition zip.hpp:28
void increment(std::index_sequence< I... >)
Definition zip.hpp:41
auto deref(std::index_sequence< I... >) const
Definition zip.hpp:37
std::tuple< decltype(*std::declval< T >().begin())... > value_type
Definition zip.hpp:29
auto operator*() const
Definition zip.hpp:64
std::tuple< decltype(std::declval< T >().begin())... > _iterators
Definition zip.hpp:35
bool operator!=(const iterator &other) const
Definition zip.hpp:60
iterator(decltype(_iterators) iterators)
Definition zip.hpp:46
iterator & operator++()
Definition zip.hpp:49
std::tuple< decltype(*std::declval< T >().begin())... > * pointer
Definition zip.hpp:31
std::tuple< decltype(*std::declval< T >().begin())... > difference_type
Definition zip.hpp:30
iterator operator++(int)
Definition zip.hpp:54
auto constexpr make_tuple_begin(Tuple &&t, std::index_sequence< Is... >)
Definition zip.hpp:79
zip_helper(T &&...seqs)
Definition zip.hpp:67
iterator end() const
Definition zip.hpp:75
iterator begin() const
Definition zip.hpp:74
iterator _end
Definition zip.hpp:91
auto constexpr make_tuple_end(Tuple &&t, std::index_sequence< Is... >)
Definition zip.hpp:84
iterator _begin
Definition zip.hpp:90
std::tuple< T... > _seqs
Definition zip.hpp:89
auto zip(T &&...seqs)
Definition zip.hpp:97
Definition boundary.hpp:22
constexpr bool is_SplineType_v
Alias to the value of is_SplineType.
Definition bspline.hpp:3243
STL namespace.