nnlib
GPU-accelerated, C/C++ neural network library.
tuple_utils.h
Go to the documentation of this file.
1 
10 #ifndef NNLIB_TUPLE_UTILS_H
11 #define NNLIB_TUPLE_UTILS_H
12 
13 #include <cstdlib>
14 #include <memory>
15 #include <utility>
16 #include <vector>
17 
18 // functions from https://stackoverflow.com/questions/72085417/how-to-extract-all-tuple-elements-of-given-types-into-new-tuple
19 // and https://stackoverflow.com/questions/42494715/c-transform-a-stdtuplea-a-a-to-a-stdvector-or-stddeque
20 
21 template<typename wantedType, typename T>
22 struct IsWantedType;
23 
24 template<typename wantedType, typename... Types>
25 struct IsWantedType<wantedType, std::tuple<Types...>> {
26 
27  static constexpr bool wanted = (std::is_same_v<wantedType, Types> || ...);
28 };
29 
30 // Ok, the ith index in the tuple, here's its std::tuple_element type.
31 // And wanted_element_t is a tuple of all types we want to extract.
32 //
33 // Based on which way the wind blows we'll produce either a std::tuple<>
34 // or a std::tuple<tuple_element_t>.
35 
36 template<size_t i, typename tuple_element_t, typename wanted_element_t,
38 struct ExtractType {
39 
40  template<typename tuple_type>
41  static auto doExtractType(const tuple_type& t) {
42  return std::tuple<>{};
43  }
44 };
45 
46 
47 template<size_t i, typename tuple_element_t, typename wanted_element_t>
48 struct ExtractType<i, tuple_element_t, wanted_element_t, true> {
49 
50  template<typename tuple_type>
51  static auto doExtractType(const tuple_type& t) {
52  return std::tuple<tuple_element_t>{std::get<i>(t)};
53  }
54 };
55 
56 // And now, a simple fold expression to pull out all wanted types
57 // and tuple-cat them together.
58 
59 template<typename wanted_element_t, typename tuple_type, size_t... i>
60 auto getTypeT(const tuple_type& t, std::index_sequence<i...>) {
61  return std::tuple_cat(
62  ExtractType<i, typename std::tuple_element<i, tuple_type>::type, wanted_element_t>::doExtractType(t)...);
63 }
64 
65 
66 template<typename... wanted_element_t, typename... types>
67 auto getType(const std::tuple<types...>& t) {
68  return getTypeT<std::tuple<wanted_element_t...>>(t, std::make_index_sequence<sizeof...(types)>());
69 }
70 
71 template<class Tuple, class T = std::decay_t<std::tuple_element_t<0, std::decay_t<Tuple>>>>
72 std::vector<T> toVector(Tuple&& tuple) {
73  return std::apply([](auto&&... elems) { return std::vector<T>{std::forward<decltype(elems)>(elems)...}; },
74  std::forward<Tuple>(tuple));
75 }
76 
77 #endif //NNLIB_TUPLE_UTILS_H
Definition: tuple_utils.h:38
Definition: tuple_utils.h:22