EasyLocalpp  3.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
tuple.hh
Go to the documentation of this file.
1 #if !defined(_TUPLE_HH_)
2 #define _TUPLE_HH_
3 
4 namespace EasyLocal {
5 
6  namespace Core {
7 
9  template <int ...>
10  struct tuple_index {};
11 
13  template <int N, int ... S>
14  struct make_index : make_index<N-1, N-1, S ...> {};
15 
17  template <int ... S>
18  struct make_index<0, S ...>
19  {
20  typedef tuple_index<S ...> type;
21  };
22 
24  template <int ...>
25  struct tail_index {};
26 
28  template <int N, int ... S>
29  struct make_tail : make_tail<N-1, N-1, S ...> {};
30 
32  template <int ... S>
33  struct make_tail<1, S ...>
34  {
35  typedef tail_index<S ...> type;
36  };
37 
39  template <typename H, typename ... T>
40  std::tuple<T...> tuple_tail(const std::tuple<H, T...>& original)
41  {
42  return tuple_tail(typename make_tail<std::tuple_size<std::tuple<H, T...>>::value>::type(), original);
43  }
44 
46  template <typename H, typename ... T>
47  std::tuple<std::reference_wrapper<T>...> tuple_tail(const std::tuple<std::reference_wrapper<H>, std::reference_wrapper<T>...>& original)
48  {
49  return tuple_tail(typename make_tail<std::tuple_size<std::tuple<H, T...>>::value>::type(), original);
50  }
51 
53  template <typename H, typename ... T, int ... S>
54  std::tuple<T...> tuple_tail(tail_index<S...>, const std::tuple<H, T...>& original)
55  {
56  return std::make_tuple(std::get<S>(original) ...);
57  }
58 
60  template <typename H, typename ... T, int ... S>
61  std::tuple<std::reference_wrapper<T>...> tuple_tail(tail_index<S...>, const std::tuple<std::reference_wrapper<H>, std::reference_wrapper<T>...>& original)
62  {
63  return std::make_tuple(std::get<S>(original) ...);
64  }
65 
67  template <unsigned int I>
68  struct print_tuple {
69  template <typename Tuple>
70  static void print(std::ostream& os, const Tuple& t)
71  {
73  os << std::get<I>(t) << " | ";
74  }
75  };
76 
77  template<>
78  struct print_tuple<0>
79  {
80  template <typename Tuple>
81  static void print(std::ostream& os, const Tuple& t)
82  {
83  os << "| " << std::get<0>(t) << " | ";
84  }
85  };
86 
87  /* template <typename H, typename S, typename ...T>
88  void print_tuple(std::ostream& os, const std::tuple<H, S, T...>& t)
89  {
90  os << std::get<0>(t) << "-";
91  auto temp_tuple_tail = tuple_tail(t);
92  print_tuple<S, T...>(os, temp_tuple_tail);
93  } */
94 
96  /* template <typename H>
97  void print_tuple(std::ostream& os, const std::tuple<H>& t)
98  {
99  os << std::get<0>(t);
100  }
101  */
102 
104  template <typename ...T>
105  std::ostream& operator<<(std::ostream& os, const std::tuple<T...>& t)
106  {
107  print_tuple<sizeof...(T)-1>::print(os, t);
108  return os;
109  }
110 
111  template <typename ... T>
112  std::istream& operator>>(std::istream& is, std::tuple<T...>& t)
113  {
114  // FIXME: to be implemented when/if really needed (not likely)
115  return is;
116  }
117 
118  template <int... s, typename... T>
119  auto ref_tuple_impl(tuple_index<s...> seq, std::tuple<T...>& tup)
120  -> decltype(std::make_tuple(std::ref(std::get<s>(tup))...))
121  {
122  return std::make_tuple(std::ref(std::get<s>(tup))...);
123  }
124 
125  template <typename... T>
126  auto to_refs(std::tuple<T...>& tup)
127  -> decltype(ref_tuple_impl(typename make_index<sizeof...(T)>::type(), tup))
128  {
129  std::tuple<std::reference_wrapper<T>...> rt = ref_tuple_impl(typename make_index<sizeof...(T)>::type(), tup);
130  return rt;
131  }
132 
133  template <int... s, typename... T>
134  auto ref_tuple_impl(tuple_index<s...> seq, const std::tuple<T...>& tup)
135  -> decltype(std::make_tuple(std::ref(std::get<s>(tup))...))
136  {
137  return std::make_tuple(std::ref(std::get<s>(tup))...);
138  }
139 
140  template <typename... T>
141  auto to_crefs(const std::tuple<T...>& tup)
142  -> decltype(ref_tuple_impl(typename make_index<sizeof...(T)>::type(), tup))
143  {
144  std::tuple<std::reference_wrapper<const T>...> rt = ref_tuple_impl(typename make_index<sizeof...(T)>::type(), tup);
145  return rt;
146  }
147 
148  }
149 }
150 
151 #endif
std::ostream & operator<<(std::ostream &os, const EvaluatedMove< Move, CFtype > &em)
std::istream & operator>>(std::istream &is, BaseParameter< T > &p)
Definition: parameter.hh:291
auto ref_tuple_impl(tuple_index< s...> seq, std::tuple< T...> &tup) -> decltype(std::make_tuple(std::ref(std::get< s >(tup))...))
Definition: tuple.hh:119
static void print(std::ostream &os, const Tuple &t)
Definition: tuple.hh:81
std::tuple< T...> tuple_tail(const std::tuple< H, T...> &original)
Definition: tuple.hh:40
auto to_refs(std::tuple< T...> &tup) -> decltype(ref_tuple_impl(typename make_index< sizeof...(T)>::type(), tup))
Definition: tuple.hh:126
auto to_crefs(const std::tuple< T...> &tup) -> decltype(ref_tuple_impl(typename make_index< sizeof...(T)>::type(), tup))
Definition: tuple.hh:141
static void print(std::ostream &os, const Tuple &t)
Definition: tuple.hh:70