OSSIA
Open Scenario System for Interactive Application
for_each.hpp
1 #pragma once
2 
3 namespace ossia
4 {
26 // Invokes the functor with every type
27 
28 template <typename T>
29 struct type_tag
30 {
31  using type = T;
32 };
33 
34 template <template <typename...> typename T, typename... Args, typename F>
35 constexpr void for_each(T<Args...>, F f)
36 {
37  (f.template operator()<Args>(), ...);
38 }
39 
40 template <template <typename...> typename T, typename... Args, typename F>
41 constexpr void for_each_tagged(T<Args...>, F f)
42 {
43  (f(type_tag<Args>{}), ...);
44 }
45 
46 template <typename... Args, typename F>
47 constexpr void for_each_type(F f)
48 {
49  (f.template operator()<Args>(), ...);
50 }
51 
52 template <template <typename...> typename T, typename... Args, typename F>
53 constexpr void for_each_type(T<Args...>, F f)
54 {
55  (f.template operator()<Args>(), ...);
56 }
57 
58 template <typename... Args, typename F>
59 constexpr void for_each_type_tagged(F f)
60 {
61  (f(type_tag<Args>{}), ...);
62 }
63 
64 // Invokes the functor with every type, this code generation is done at compile
65 // time
66 template <typename... Args, typename F>
67 constexpr void for_each_type_if(F&& f)
68 {
69  (f.template operator()<Args>() || ...);
70 }
71 
72 template <typename... Args, typename F>
73 constexpr void for_each_type_if_tagged(F&& f)
74 {
75  (f(type_tag<Args>{}) || ...);
76 }
77 }
Definition: git_info.h:7