claw  1.9.0
type_list.hpp
Go to the documentation of this file.
1 /*
2  CLAW - a C++ Library Absolutely Wonderful
3 
4  CLAW is a free library without any particular aim but being useful to
5  anyone.
6 
7  Copyright (C) 2005-2011 Julien Jorge
8 
9  This library is free software; you can redistribute it and/or
10  modify it under the terms of the GNU Lesser General Public
11  License as published by the Free Software Foundation; either
12  version 2.1 of the License, or (at your option) any later version.
13 
14  This library is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  Lesser General Public License for more details.
18 
19  You should have received a copy of the GNU Lesser General Public
20  License along with this library; if not, write to the Free Software
21  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 
23  contact: julien.jorge@stuff-o-matic.com
24 */
30 #ifndef __CLAW_TYPE_LIST_HPP__
31 #define __CLAW_TYPE_LIST_HPP__
32 
34 #include <claw/meta/no_type.hpp>
35 #include <claw/meta/same_type.hpp>
36 
37 namespace claw
38 {
39  namespace meta
40  {
58  template <typename Head, typename Queue>
59  struct type_list
60  {
62  typedef Head head_type;
63 
65  typedef Queue queue_type;
66 
67  }; // struct type_list
68 
77  template <typename Delimiter, typename TypeList>
79 
82  template <typename Delimiter>
83  struct split_type_list_at<Delimiter, no_type>
84  {
87 
90 
91  }; // struct split_type_list_at
92 
101  template <typename Delimiter, typename TypeList>
102  struct split_type_list_at
103  {
105  typedef typename if_then_else<
107  no_type, /* delimiter is found, mark the end of the list. */
108  type_list /* otherwise, cut in the remaining types. */
109  <typename TypeList::head_type,
110  typename split_type_list_at<
111  Delimiter, typename TypeList::queue_type>::left_part_type> >::
113 
115  typedef typename if_then_else<
117  TypeList, /* delimiter is found, this is the right part. */
118  typename split_type_list_at<
119  Delimiter, typename TypeList::queue_type>::right_part_type>::
121 
122  }; // struct split_type_list_at
123 
128  template <typename T1>
130  {
133  }; // struct type_list_maker_1
134 
139  template <typename T1, typename T2>
141  {
144  }; // struct type_list_maker_2
145 
150  template <typename T1, typename T2, typename T3>
152  {
155  }; // struct type_list_maker_3
156 
161  template <typename T1, typename T2, typename T3, typename T4>
163  {
167  }; // struct type_list_maker_4
168 
173  template <typename T1, typename T2, typename T3, typename T4, typename T5>
175  {
179  }; // struct type_list_maker_5
180 
185  template <typename T1, typename T2, typename T3, typename T4, typename T5,
186  typename T6>
188  {
190  typedef type_list<T1,
193  }; // struct type_list_maker_6
194 
199  template <typename T1, typename T2, typename T3, typename T4, typename T5,
200  typename T6, typename T7>
202  {
204  typedef type_list<
207  }; // struct type_list_maker_7
208 
213  template <typename T1, typename T2, typename T3, typename T4, typename T5,
214  typename T6, typename T7, typename T8>
216  {
218  typedef type_list<
221  }; // struct type_list_maker_8
222 
227  template <typename T1, typename T2, typename T3, typename T4, typename T5,
228  typename T6, typename T7, typename T8, typename T9>
230  {
232  typedef type_list<T1, typename type_list_maker_8<T2, T3, T4, T5, T6, T7,
233  T8, T9>::result>
235  }; // struct type_list_maker_9
236 
241  template <typename T1, typename T2, typename T3, typename T4, typename T5,
242  typename T6, typename T7, typename T8, typename T9, typename T10>
244  {
246  typedef type_list<T1, typename type_list_maker_9<T2, T3, T4, T5, T6, T7,
247  T8, T9, T10>::result>
249  }; // struct type_list_maker_10
250 
255  template <typename T1, typename T2, typename T3, typename T4, typename T5,
256  typename T6, typename T7, typename T8, typename T9, typename T10,
257  typename T11>
259  {
261  typedef type_list<T1,
262  typename type_list_maker_10<T2, T3, T4, T5, T6, T7, T8,
263  T9, T10, T11>::result>
265  }; // struct type_list_maker_11
266 
271  template <typename T1, typename T2, typename T3, typename T4, typename T5,
272  typename T6, typename T7, typename T8, typename T9, typename T10,
273  typename T11, typename T12>
275  {
277  typedef type_list<T1,
278  typename type_list_maker_11<T2, T3, T4, T5, T6, T7, T8,
279  T9, T10, T11, T12>::result>
281  }; // struct type_list_maker_12
282 
287  template <typename T1, typename T2, typename T3, typename T4, typename T5,
288  typename T6, typename T7, typename T8, typename T9, typename T10,
289  typename T11, typename T12, typename T13>
291  {
293  typedef type_list<
294  T1, typename type_list_maker_12<T2, T3, T4, T5, T6, T7, T8, T9, T10,
295  T11, T12, T13>::result>
297  }; // struct type_list_maker_13
298 
303  template <typename T1, typename T2, typename T3, typename T4, typename T5,
304  typename T6, typename T7, typename T8, typename T9, typename T10,
305  typename T11, typename T12, typename T13, typename T14>
307  {
309  typedef type_list<
310  T1, typename type_list_maker_13<T2, T3, T4, T5, T6, T7, T8, T9, T10,
311  T11, T12, T13, T14>::result>
313  }; // struct type_list_maker_14
314 
319  template <typename T1, typename T2, typename T3, typename T4, typename T5,
320  typename T6, typename T7, typename T8, typename T9, typename T10,
321  typename T11, typename T12, typename T13, typename T14,
322  typename T15>
324  {
326  typedef type_list<
327  T1, typename type_list_maker_14<T2, T3, T4, T5, T6, T7, T8, T9, T10,
328  T11, T12, T13, T14, T15>::result>
330  }; // struct type_list_maker_15
331 
337  template <
338  typename T1, typename T2 = no_type, typename T3 = no_type,
339  typename T4 = no_type, typename T5 = no_type, typename T6 = no_type,
340  typename T7 = no_type, typename T8 = no_type, typename T9 = no_type,
341  typename T10 = no_type, typename T11 = no_type, typename T12 = no_type,
342  typename T13 = no_type, typename T14 = no_type, typename T15 = no_type>
344  {
346  typedef typename split_type_list_at<
347  no_type, typename type_list_maker_15<
348  T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
349  T14, T15>::result>::left_part_type result;
350  }; // struct type_list_maker
351 
364  template <typename T, typename List>
366  {
367  enum
368  {
369  result = same_type < T,
370  typename List::head_type > ::result || type_list_find < T,
371  typename List::queue_type > ::result
372  };
373  }; // struct type_list_find
374 
375  template <typename T>
377  {
378  enum
379  {
380  result = same_type < T,
381  no_type > ::result
382  };
383  }; // struct type_list_find
384 
391  template <typename List>
393  {
394  enum
395  {
396  result = !type_list_find < typename List::head_type,
397  typename List::queue_type
399  };
400  }; // struct type_list_is_a_set
401 
402  template <>
404  {
405  enum
406  {
407  result = true
408  };
409  }; // struct type_list_is_a_set [no_type]
410 
416  template <typename List>
418  {
419  enum
420  {
422  };
423  }; // struct type_list_length
424 
425  template <>
427  {
428  enum
429  {
430  result = 0
431  };
432  }; // struct type_list_length [no_type]
433 
441  template <typename T, typename List>
443 
444  template <typename T, typename Tail>
445  struct type_list_contains<T, type_list<T, Tail> >
446  {
447  enum
448  {
449  result = true
450  };
451  }; // struct type_list_contains
452 
453  template <typename T>
455  {
456  enum
457  {
458  result = false
459  };
460  }; // struct type_list_contains
461 
462  template <typename T, typename Head, typename Tail>
463  struct type_list_contains<T, type_list<Head, Tail> >
464  {
465  enum
466  {
467  result = type_list_contains < T,
468  Tail > ::result
469  };
470  }; // struct type_list_contains
471 
473  typedef type_list_maker<
474  signed char, unsigned char, signed short, unsigned short, signed int,
475  unsigned int, signed long, unsigned long,
476 #ifndef __STRICT_ANSI__
477  signed long long, unsigned long long,
478 #endif
479  float, double, long double, bool>::result cpp_type_list;
480 
481  }
482 }
483 
484 #endif // __CLAW_TYPE_LIST_HPP__
A type list with eleven types, more readable than an imbricated type_list.
Definition: type_list.hpp:258
type_list< T1, typename type_list_maker_11< T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12 >::result > result
The list described by this implementation.
Definition: type_list.hpp:280
A type list with thirteen types, more readable than an imbricated type_list.
Definition: type_list.hpp:290
A type list with seven types, more readable than an imbricated type_list.
Definition: type_list.hpp:201
Split a type_list according to the first instance of a given type.
Definition: type_list.hpp:78
type_list< T1, typename type_list_maker_3< T2, T3, T4 >::result > result
The list described by this implementation.
Definition: type_list.hpp:166
if_then_else< same_type< Delimiter, typename TypeList::head_type >::result, TypeList, typename split_type_list_at< Delimiter, typename TypeList::queue_type >::right_part_type >::result right_part_type
The right part of the list. The delimiter is included.
Definition: type_list.hpp:120
type_list< T1, typename type_list_maker_6< T2, T3, T4, T5, T6, T7 >::result > result
The list described by this implementation.
Definition: type_list.hpp:206
A type list with two types, more readable than an imbricated type_list.
Definition: type_list.hpp:140
type_list< T1, typename type_list_maker_14< T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 >::result > result
The list described by this implementation.
Definition: type_list.hpp:329
type_list< T1, typename type_list_maker_4< T2, T3, T4, T5 >::result > result
The list described by this implementation.
Definition: type_list.hpp:178
This class checks if each type in a type_list<> is present only once.
Definition: type_list.hpp:392
Tell if a given type list contains a given type.
Definition: type_list.hpp:442
A type list with three types, more readable than an imbricated type_list.
Definition: type_list.hpp:151
type_list< T1, typename type_list_maker_13< T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14 >::result > result
The list described by this implementation.
Definition: type_list.hpp:312
no_type right_part_type
There is no right part if there is no list.
Definition: type_list.hpp:89
Queue queue_type
The remaining types in the list.
Definition: type_list.hpp:65
A type list with twelve types, more readable than an imbricated type_list.
Definition: type_list.hpp:274
Structures for meta-programming.
A type list with fourteen types, more readable than an imbricated type_list.
Definition: type_list.hpp:306
type_list< T1, typename type_list_maker_2< T2, T3 >::result > result
The list described by this implementation.
Definition: type_list.hpp:154
A type list with height types, more readable than an imbricated type_list.
Definition: type_list.hpp:215
Check if two types are the same.
This predicate tells if two types are the sames.
Definition: same_type.hpp:48
type_list< T1, typename type_list_maker_7< T2, T3, T4, T5, T6, T7, T8 >::result > result
The list described by this implementation.
Definition: type_list.hpp:220
A type list with four types, more readable than an imbricated type_list.
Definition: type_list.hpp:162
type_list< T1, no_type > result
The list described by this implementation.
Definition: type_list.hpp:132
This class computes the length of a list of types.
Definition: type_list.hpp:417
if_then_else< same_type< Delimiter, typename TypeList::head_type >::result, no_type, type_list< typename TypeList::head_type, typename split_type_list_at< Delimiter, typename TypeList::queue_type >::left_part_type > >::result left_part_type
The left part of the list. The delimiter is not included.
Definition: type_list.hpp:112
A type list with fifteen types, more readable than an imbricated type_list.
Definition: type_list.hpp:323
Head head_type
The first type in the list.
Definition: type_list.hpp:62
Use this class to make a list of types.
Definition: type_list.hpp:59
A type list with nine types, more readable than an imbricated type_list.
Definition: type_list.hpp:229
Check if a type is present in a type_list.
Definition: type_list.hpp:365
type_list< T1, typename type_list_maker_5< T2, T3, T4, T5, T6 >::result > result
The list described by this implementation.
Definition: type_list.hpp:192
type_list< T1, typename type_list_maker_9< T2, T3, T4, T5, T6, T7, T8, T9, T10 >::result > result
The list described by this implementation.
Definition: type_list.hpp:248
A type list with ten types, more readable than an imbricated type_list.
Definition: type_list.hpp:243
An empty class not considered as a effective type.
A type list with up to six types, more readable than an imbricated type_list, more readable than type...
Definition: type_list.hpp:343
A type list with five types, more readable than an imbricated type_list.
Definition: type_list.hpp:174
type_list< T1, typename type_list_maker_1< T2 >::result > result
The list described by this implementation.
Definition: type_list.hpp:143
no_type left_part_type
There is no left part if there is no list.
Definition: type_list.hpp:86
split_type_list_at< no_type, typename type_list_maker_15< T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 >::result >::left_part_type result
The list described by this implementation.
Definition: type_list.hpp:349
This structure allows to do conditional typing.
Definition: conditional.hpp:50
type_list< T1, typename type_list_maker_10< T2, T3, T4, T5, T6, T7, T8, T9, T10, T11 >::result > result
The list described by this implementation.
Definition: type_list.hpp:264
This is the main namespace.
Definition: application.hpp:49
A type list with a single type, more readable than an imbricated type_list.
Definition: type_list.hpp:129
type_list< T1, typename type_list_maker_8< T2, T3, T4, T5, T6, T7, T8, T9 >::result > result
The list described by this implementation.
Definition: type_list.hpp:234
Empty type.
Definition: no_type.hpp:40
type_list< T1, typename type_list_maker_12< T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13 >::result > result
The list described by this implementation.
Definition: type_list.hpp:296
type_list_maker< signed char, unsigned char, signed short, unsigned short, signed int, unsigned int, signed long, unsigned long, signed long long, unsigned long long, float, double, long double, bool >::result cpp_type_list
The list of the types of the C++ language.
Definition: type_list.hpp:479
A type list with six types, more readable than an imbricated type_list.
Definition: type_list.hpp:187