claw 1.9.0
 
Loading...
Searching...
No Matches
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>
36
37namespace 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>
78 struct split_type_list_at;
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>
103 {
105 typedef typename if_then_else<
106 same_type<Delimiter, typename TypeList::head_type>::result,
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<
116 same_type<Delimiter, typename TypeList::head_type>::result,
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,
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
398 > ::result&& type_list_is_a_set<typename List::queue_type>::result
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 {
421 result = 1 + type_list_length<typename List::queue_type>::result
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__
Structures for meta-programming.
Structures for meta-programmation.
Definition claw.hpp:76
type_list_maker< signedchar, unsignedchar, signedshort, unsignedshort, signedint, unsignedint, signedlong, unsignedlong, signedlonglong, unsignedlonglong, float, double, longdouble, bool >::result cpp_type_list
The list of the types of the C++ language.
This is the main namespace.
An empty class not considered as a effective type.
Check if two types are the same.
This structure allows to do conditional typing.
Empty type.
Definition no_type.hpp:41
This predicate tells if two types are the sames.
Definition same_type.hpp:49
no_type right_part_type
There is no right part if there is no list.
Definition type_list.hpp:89
no_type left_part_type
There is no left part if there is no list.
Definition type_list.hpp:86
Split a type_list according to the first instance of a given type.
if_then_else< same_type< Delimiter, typenameTypeList::head_type >::result, no_type, type_list< typenameTypeList::head_type, typenamesplit_type_list_at< Delimiter, typenameTypeList::queue_type >::left_part_type > >::result left_part_type
The left part of the list. The delimiter is not included.
if_then_else< same_type< Delimiter, typenameTypeList::head_type >::result, TypeList, typenamesplit_type_list_at< Delimiter, typenameTypeList::queue_type >::right_part_type >::result right_part_type
The right part of the list. The delimiter is included.
Tell if a given type list contains a given type.
Check if a type is present in a type_list.
This class checks if each type in a type_list<> is present only once.
This class computes the length of a list of types.
A type list with ten types, more readable than an imbricated type_list.
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.
A type list with eleven types, more readable than an imbricated type_list.
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.
A type list with twelve types, more readable than an imbricated type_list.
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.
A type list with thirteen types, more readable than an imbricated type_list.
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.
A type list with fourteen types, more readable than an imbricated type_list.
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.
A type list with fifteen types, more readable than an imbricated type_list.
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.
A type list with a single type, more readable than an imbricated type_list.
type_list< T1, no_type > result
The list described by this implementation.
A type list with two types, more readable than an imbricated type_list.
type_list< T1, typename type_list_maker_1< T2 >::result > result
The list described by this implementation.
A type list with three types, more readable than an imbricated type_list.
type_list< T1, typename type_list_maker_2< T2, T3 >::result > result
The list described by this implementation.
A type list with four types, more readable than an imbricated type_list.
type_list< T1, typename type_list_maker_3< T2, T3, T4 >::result > result
The list described by this implementation.
A type list with five types, more readable than an imbricated type_list.
type_list< T1, typename type_list_maker_4< T2, T3, T4, T5 >::result > result
The list described by this implementation.
A type list with six types, more readable than an imbricated type_list.
type_list< T1, typename type_list_maker_5< T2, T3, T4, T5, T6 >::result > result
The list described by this implementation.
A type list with seven types, more readable than an imbricated type_list.
type_list< T1, typename type_list_maker_6< T2, T3, T4, T5, T6, T7 >::result > result
The list described by this implementation.
A type list with height types, more readable than an imbricated type_list.
type_list< T1, typename type_list_maker_7< T2, T3, T4, T5, T6, T7, T8 >::result > result
The list described by this implementation.
A type list with nine types, more readable than an imbricated type_list.
type_list< T1, typename type_list_maker_8< T2, T3, T4, T5, T6, T7, T8, T9 >::result > result
The list described by this implementation.
A type list with up to six types, more readable than an imbricated type_list, more readable than type...
split_type_list_at< no_type, typenametype_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.
Use this class to make a list of types.
Definition type_list.hpp:60
Queue queue_type
The remaining types in the list.
Definition type_list.hpp:65
Head head_type
The first type in the list.
Definition type_list.hpp:62