Cogs.Core
Tuple.h
1#pragma once
2
3#include <tuple>
4
5namespace Cogs
6{
8 namespace Detail
9 {
10 template<int Index, class Search, class First, class... Types>
12 {
13 typedef typename get_internal<Index + 1, Search, Types...>::type type;
14 static const int index = Index;
15 };
16
17 template<int Index, class Search, class... Types>
18 struct get_internal<Index, Search, Search, Types...>
19 {
20 typedef get_internal type;
21 static const int index = Index;
22 };
23 }
24
25 template<class T, class... Types>
26 T & get(std::tuple<Types...> & tuple)
27 {
28 return std::get<Detail::get_internal<0, T, Types...>::type::index>(tuple);
29 }
30
31 template<class T, class... Types>
32 const T & get(const std::tuple<Types...> & tuple)
33 {
34 return std::get<Detail::get_internal<0, T, Types...>::type::index>(tuple);
35 }
36
37 namespace Detail
38 {
39 template<int... Is>
40 struct seq {};
41
42 template<int N, int... Is>
43 struct gen_seq : gen_seq<N - 1, N - 1, Is...> {};
44
45 template<int... Is>
46 struct gen_seq<0, Is...> : seq<Is...>{};
47
48 template<typename T, typename F, int... Is>
49 void for_each(T && t, F f, seq<Is...>)
50 {
51 auto l = { (f(std::get<Is>(t)), 0)... };
52 static_cast<void>(l);
53 }
54 }
55
62 template<typename... Ts, typename F>
63 void for_each_in_tuple(std::tuple<Ts...> & t, F f)
64 {
65 Detail::for_each(t, f, Detail::gen_seq<sizeof...(Ts)>());
66 }
67}
Contains all Cogs related functionality.
Definition: FieldSetter.h:23
void for_each_in_tuple(std::tuple< Ts... > &t, F f)
Utility method for executing the given function over all members in a tuple.
Definition: Tuple.h:63