]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // (C) Copyright John Maddock 2005. |
2 | // Use, modification and distribution are subject to the | |
3 | // Boost Software License, Version 1.0. (See accompanying file | |
4 | // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
5 | ||
6 | #ifdef TEST_STD_HEADERS | |
7 | #include <type_traits> | |
8 | #else | |
9 | #include <boost/tr1/type_traits.hpp> | |
10 | #endif | |
11 | ||
12 | #include <boost/static_assert.hpp> | |
13 | #include <boost/type_traits/is_same.hpp> | |
14 | #include <boost/type_traits/is_base_and_derived.hpp> | |
15 | ||
16 | template <class T> | |
17 | void check_value_trait(const T&) | |
18 | { | |
19 | T t; | |
20 | (void)t; | |
21 | typedef typename T::type type; | |
22 | typedef typename T::value_type value_type; | |
23 | ||
24 | BOOST_STATIC_ASSERT((::boost::is_base_and_derived< | |
25 | std::tr1::integral_constant<value_type, T::value>, T>::value)); | |
26 | BOOST_STATIC_ASSERT((::boost::is_same< | |
27 | std::tr1::integral_constant<value_type, T::value>, type>::value)); | |
28 | } | |
29 | ||
30 | template <class T> | |
31 | void check_transform_trait(const T* p) | |
32 | { | |
33 | typedef typename T::type type; | |
34 | } | |
35 | ||
36 | struct UDT{}; | |
37 | union union_type{ char c; int i; }; | |
38 | enum enum_type{ one, two }; | |
39 | ||
40 | #define check_unary_trait(trait)\ | |
41 | check_value_trait(std::tr1::trait<void>());\ | |
42 | check_value_trait(std::tr1::trait<int>());\ | |
43 | check_value_trait(std::tr1::trait<float>());\ | |
44 | check_value_trait(std::tr1::trait<UDT>());\ | |
45 | /*check_value_trait(std::tr1::trait<union_type>());*/\ | |
46 | check_value_trait(std::tr1::trait<enum_type>());\ | |
47 | check_value_trait(std::tr1::trait<void *>());\ | |
48 | check_value_trait(std::tr1::trait<UDT&>());\ | |
49 | check_value_trait(std::tr1::trait<int (void)>());\ | |
50 | check_value_trait(std::tr1::trait<int (&)(void)>());\ | |
51 | check_value_trait(std::tr1::trait<int (*)(void)>());\ | |
52 | check_value_trait(std::tr1::trait<int (UDT::*)(void)>());\ | |
53 | check_value_trait(std::tr1::trait<int (UDT::*)>());\ | |
54 | check_value_trait(std::tr1::trait<int[4]>());\ | |
55 | check_value_trait(std::tr1::trait<int[]>()); | |
56 | ||
57 | #define check_binary_trait(trait)\ | |
58 | check_value_trait(std::tr1::trait<void, int>());\ | |
59 | check_value_trait(std::tr1::trait<int, double>());\ | |
60 | check_value_trait(std::tr1::trait<float, float>());\ | |
61 | check_value_trait(std::tr1::trait<UDT, UDT&>());\ | |
62 | /*check_value_trait(std::tr1::trait<union_type>());*/\ | |
63 | check_value_trait(std::tr1::trait<enum_type, enum_type>());\ | |
64 | check_value_trait(std::tr1::trait<void *, const void*>());\ | |
65 | check_value_trait(std::tr1::trait<UDT&, int>());\ | |
66 | check_value_trait(std::tr1::trait<int (void), int (void)>());\ | |
67 | check_value_trait(std::tr1::trait<int (&)(void), int (void)>());\ | |
68 | check_value_trait(std::tr1::trait<int (*)(void), int (void)>());\ | |
69 | check_value_trait(std::tr1::trait<int (UDT::*)(void), int (void)>());\ | |
70 | check_value_trait(std::tr1::trait<int (UDT::*), int (UDT::*)>());\ | |
71 | check_value_trait(std::tr1::trait<int[4], int[3]>());\ | |
72 | check_value_trait(std::tr1::trait<int[4], int[4]>()); | |
73 | ||
74 | #define check_transform(trait)\ | |
75 | check_transform_trait((std::tr1::trait<void>*)(0));\ | |
76 | check_transform_trait((std::tr1::trait<int>*)(0));\ | |
77 | check_transform_trait((std::tr1::trait<float>*)(0));\ | |
78 | check_transform_trait((std::tr1::trait<UDT>*)(0));\ | |
79 | check_transform_trait((std::tr1::trait<enum_type>*)(0));\ | |
80 | check_transform_trait((std::tr1::trait<void *>*)(0));\ | |
81 | check_transform_trait((std::tr1::trait<UDT&>*)(0));\ | |
82 | check_transform_trait((std::tr1::trait<int (void)>*)(0));\ | |
83 | check_transform_trait((std::tr1::trait<int (&)(void)>*)(0));\ | |
84 | check_transform_trait((std::tr1::trait<int (*)(void)>*)(0));\ | |
85 | check_transform_trait((std::tr1::trait<int (UDT::*)(void)>*)(0));\ | |
86 | check_transform_trait((std::tr1::trait<int (UDT::*)>*)(0));\ | |
87 | check_transform_trait((std::tr1::trait<int[4]>*)(0)); | |
88 | ||
89 | int main() | |
90 | { | |
91 | check_unary_trait(is_void); | |
92 | check_unary_trait(is_integral); | |
93 | check_unary_trait(is_floating_point); | |
94 | check_unary_trait(is_array); | |
95 | check_unary_trait(is_pointer); | |
96 | check_unary_trait(is_reference); | |
97 | check_unary_trait(is_member_object_pointer); | |
98 | check_unary_trait(is_member_function_pointer); | |
99 | check_unary_trait(is_enum); | |
100 | check_unary_trait(is_union); | |
101 | check_unary_trait(is_class); | |
102 | check_unary_trait(is_function); | |
103 | check_unary_trait(is_arithmetic); | |
104 | check_unary_trait(is_fundamental); | |
105 | check_unary_trait(is_object); | |
106 | check_unary_trait(is_scalar); | |
107 | check_unary_trait(is_compound); | |
108 | check_unary_trait(is_member_pointer); | |
109 | check_unary_trait(is_const); | |
110 | check_unary_trait(is_volatile); | |
111 | check_unary_trait(is_pod); | |
112 | check_unary_trait(is_empty); | |
113 | check_unary_trait(is_polymorphic); | |
114 | check_unary_trait(is_abstract); | |
115 | check_unary_trait(has_trivial_constructor); | |
116 | check_unary_trait(has_trivial_copy); | |
117 | check_unary_trait(has_trivial_assign); | |
118 | check_unary_trait(has_trivial_destructor); | |
119 | check_unary_trait(has_nothrow_constructor); | |
120 | check_unary_trait(has_nothrow_copy); | |
121 | check_unary_trait(has_nothrow_assign); | |
122 | check_unary_trait(has_virtual_destructor); | |
123 | check_unary_trait(is_signed); | |
124 | check_unary_trait(is_unsigned); | |
125 | ||
126 | check_value_trait(std::tr1::alignment_of<int>()); | |
127 | check_value_trait(std::tr1::alignment_of<UDT>()); | |
128 | check_value_trait(std::tr1::alignment_of<int[4]>()); | |
129 | ||
130 | check_unary_trait(rank); | |
131 | check_unary_trait(extent); | |
132 | ||
133 | check_binary_trait(is_same); | |
134 | check_binary_trait(is_base_of); | |
135 | check_binary_trait(is_convertible); | |
136 | ||
137 | check_transform(remove_const); | |
138 | check_transform(remove_volatile); | |
139 | check_transform(remove_cv); | |
140 | check_transform(add_const); | |
141 | check_transform(add_volatile); | |
142 | check_transform(add_cv); | |
143 | check_transform(remove_reference); | |
144 | check_transform(add_reference); | |
145 | check_transform(remove_extent); | |
146 | check_transform(remove_all_extents); | |
147 | check_transform(remove_pointer); | |
148 | check_transform(add_pointer); | |
149 | check_transform_trait((::std::tr1::aligned_storage<1,1>*)(0)); | |
150 | check_transform_trait((::std::tr1::aligned_storage<4,1>*)(0)); | |
151 | check_transform_trait((::std::tr1::aligned_storage<2,2>*)(0)); | |
152 | check_transform_trait((::std::tr1::aligned_storage<4,2>*)(0)); | |
153 | check_transform_trait((::std::tr1::aligned_storage<4,4>*)(0)); | |
154 | check_transform_trait((::std::tr1::aligned_storage<4,4>*)(0)); | |
155 | check_transform_trait((::std::tr1::aligned_storage<8,8>*)(0)); | |
156 | ||
157 | return 0; | |
158 | } | |
159 |