framework
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
pack_container.hpp
Go to the documentation of this file.
1 // Copyright (C) 2012 iwg molw5
2 // For conditions of distribution and use, see copyright notice in COPYING
3 
13 #pragma once
14 
15 #include <cstddef>
16 #include <type_traits>
17 
18 namespace framework
19 {
20  namespace detail
21  {
22  template <typename... Packs>
23  struct merge_packs_impl;
24 
25  template <typename T, template <typename> class Macher>
26  struct filter_pack_impl;
27 
28  template <typename Pack>
29  struct unique_filter_pack_impl;
30 
31  template <typename Pack, template <typename> class Matcher, std::size_t Position, std::size_t Index = 0>
32  struct find_pack_impl;
33 
34  template <typename T>
35  struct is_pack_container;
36 
37  template <typename Type, std::size_t Size>
38  struct make_values_impl;
39 
40  template <typename Pack, template <typename, typename> class LessThan>
41  struct sort_pack_impl;
42  }
43 
50  template <typename... Types>
52  {
56  enum { size = sizeof... (Types) };
57  };
58 
64  template <typename T>
65  using is_pack_container = typename detail::is_pack_container <T>::type;
66 
81  template <typename... Packs>
82  using merge_packs = typename detail::merge_packs_impl <Packs...>::type;
83 
101  template <typename Pack, template <typename> class Matcher>
102  using filter_pack = typename detail::filter_pack_impl <Pack, Matcher>::type;
103 
120  template <typename Values, template <typename> class Matcher>
121  using unique_filter_pack = typename detail::unique_filter_pack_impl <filter_pack <Values, Matcher>>::type;
122 
135  template <typename Pack, template <typename> class Matcher, std::size_t Position = 0>
136  using find_pack = std::integral_constant <std::size_t, detail::find_pack_impl <Pack, Matcher, Position>::value>;
137 
138  namespace detail
139  {
140  template <typename Lhs, typename Rhs>
141  struct value_less_than_impl
142  {
143  using type =
144  typename std::conditional <
145  (Lhs::value < Rhs::value),
146  std::true_type,
147  std::false_type
148  >::type;
149  };
150  }
151 
162  template <typename Lhs, typename Rhs>
163  using value_less_than = typename detail::value_less_than_impl <Lhs, Rhs>::type;
164 
171  template <typename Pack, template <typename, typename> class LessThan = value_less_than>
172  using sort_pack = typename detail::sort_pack_impl <Pack, LessThan>::type;
173 
188  template <typename Type, std::size_t Size>
189  using make_values = typename detail::make_values_impl <Type, Size>::type;
190 
202  template <std::size_t Size>
203  using make_indices = typename detail::make_values_impl <std::size_t, Size>::type;
204 }
205 
206 #include <framework/common/pack_container.inl>