Alchemy  1.0
A framework to robustly process network messages and structured data
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
type_list/size_at.h
1 /// @file meta/type_list/size_at.h
2 ///
3 /// Calculates the size in bytes of the type at the specified index in the
4 /// type Container.
5 ///
6 /// This construct depends on the SizeOf meta processing construct.
7 ///
8 /// The MIT License(MIT)
9 /// @copyright 2014 Paul M Watt
10 // ****************************************************************************
11 #ifndef SIZE_AT_H_INCLUDED
12 # error "Do not include this file directly. Use <Pb/size_at.h> instead"
13 #endif
14 
15 namespace Hg
16 {
17 
18 // ****************************************************************************
19 /// Defines each type SizeAt lookup
20 ///
21 /// This macro will generate a set of code for type definitions.
22 /// Generated output for 3 as the input value:
23 ///
24 /// Generated Output:
25 /// ~~~{.cpp}
26 /// tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(3);
27 ///
28 /// template <TypeList < typename T0, typename T1, typename T2, typename T3,
29 /// typename T4, typename T5, typename T6, typename T7,
30 /// typename T8, typename T9, typename T10, typename T11,
31 /// typename T12, typename T13, typename T14, typename T15,
32 /// typename T16, typename T17, typename T18, typename T19,
33 /// typename T20, typename T21, typename T22, typename T23,
34 /// typename T24, typename T25, typename T26, typename T27,
35 /// typename T28, typename T29, typename T30, typename T31> >
36 /// struct SizeAt<(3),
37 /// TypeList < T0, T1, T2, T3, T4, T5, T6, T7,
38 /// T8, T9, T10, T11, T12, T13, T14, T15,
39 /// T16, T17, T18, T19, T20, T21, T22, T23,
40 /// T24, T25, T26, T27, T28, T29, T30, T31
41 /// >
42 /// >
43 /// {
44 /// typedef TypeList < T0, T1, T2, T3, T4, T5, T6, T7,
45 /// T8, T9, T10, T11, T12, T13, T14, T15,
46 /// T16, T17, T18, T19, T20, T21, T22, T23,
47 /// T24, T25, T26, T27, T28, T29, T30, T31
48 /// > Container;
49 /// static const size_t value = sizeof(TypeAt<3,Container>::type);
50 /// };
51 /// ~~~
52 ///
53 /// @note
54 /// This is a locally defined MACRO. After the list of entries have been defined
55 /// to generate the required function calls, the MACRO will be undefined.
56 ///
57 #define tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(I) \
58 template <TMP_ARRAY_32(typename T)> \
59 struct SizeAt<(I), TypeList<TMP_ARRAY_32(T)> > \
60 { \
61  typedef TypeList<TMP_ARRAY_32(T)> Container; \
62  typedef typename TypeAt<(I),Container>::type TypeAtIndex; \
63  enum { value = SizeOf<TypeAtIndex>::value }; \
64 }
65 
66 // MACRO Declarations for each ENTRY that is supported for the TypeList size **
67 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(0);
68 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(1);
69 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(2);
70 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(3);
71 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(4);
72 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(5);
73 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(6);
74 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(7);
75 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(8);
76 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(9);
77 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(10);
78 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(11);
79 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(12);
80 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(13);
81 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(14);
82 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(15);
83 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(16);
84 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(17);
85 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(18);
86 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(19);
87 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(20);
88 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(21);
89 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(22);
90 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(23);
91 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(24);
92 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(25);
93 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(26);
94 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(27);
95 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(28);
96 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(29);
97 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(30);
98 tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY(31);
99 
100 // Undefining the declaration MACRO to prevent its further use. ****************
101 #undef tmp_ALCHEMY_TYPELIST_SIZEOF_ENTRY
102 
103 } // namespace Hg
104