aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@suse.de>2004-12-27 18:51:12 +0000
committerPaolo Carlini <pcarlini@suse.de>2004-12-27 18:51:12 +0000
commit6b961dae0202e327c7aba47abddc76ca76e00ea4 (patch)
tree15abfa4e3f3fceba09a96b78ae5c3f7d2f3b77c7 /libstdc++-v3
parent624b4be21041e0590e16f7b6c38d898f106b4148 (diff)
2004-12-27 Paolo Carlini <pcarlini@suse.de>
* include/tr1/type_traits: Rework the _DEFINE_SPEC* macros. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@92647 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog4
-rw-r--r--libstdc++-v3/include/tr1/type_traits100
2 files changed, 51 insertions, 53 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 63e54f7fe8d..ba4b65ec707 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,7 @@
+2004-12-27 Paolo Carlini <pcarlini@suse.de>
+
+ * include/tr1/type_traits: Rework the _DEFINE_SPEC* macros.
+
2004-12-26 Paolo Carlini <pcarlini@suse.de>
* include/tr1/type_traits (__is_enum_helper): Slightly simplify,
diff --git a/libstdc++-v3/include/tr1/type_traits b/libstdc++-v3/include/tr1/type_traits
index 7b15b179e23..d035a197b78 100644
--- a/libstdc++-v3/include/tr1/type_traits
+++ b/libstdc++-v3/include/tr1/type_traits
@@ -40,26 +40,29 @@ namespace tr1
typedef struct { char __arr[2]; } __two;
};
-#define _DEFINE_SPEC_0_HELPER(_Spec) \
- template<> \
- struct _Spec \
- : public true_type { };
-
-#define _DEFINE_SPEC_1_HELPER(_Spec) \
- template<typename _Tp> \
- struct _Spec \
- _DEFINE_SPEC_1_VAR
+#define _DEFINE_SPEC_BODY(_Value) \
+ : public integral_constant<bool, _Value> { };
+
+#define _DEFINE_SPEC_0_HELPER(_Spec, _Value) \
+ template<> \
+ struct _Spec \
+ _DEFINE_SPEC_BODY(_Value)
+
+#define _DEFINE_SPEC_1_HELPER(_Spec, _Value) \
+ template<typename _Tp> \
+ struct _Spec \
+ _DEFINE_SPEC_BODY(_Value)
-#define _DEFINE_SPEC_2_HELPER(_Spec) \
- template<typename _Tp, typename _Cp> \
- struct _Spec \
- _DEFINE_SPEC_2_VAR
+#define _DEFINE_SPEC_2_HELPER(_Spec, _Value) \
+ template<typename _Tp, typename _Cp> \
+ struct _Spec \
+ _DEFINE_SPEC_BODY(_Value)
-#define _DEFINE_SPEC(_Order, _Trait, _Type) \
- _DEFINE_SPEC_##_Order##_HELPER(_Trait<_Type>) \
- _DEFINE_SPEC_##_Order##_HELPER(_Trait<_Type const>) \
- _DEFINE_SPEC_##_Order##_HELPER(_Trait<_Type volatile>) \
- _DEFINE_SPEC_##_Order##_HELPER(_Trait<_Type const volatile>)
+#define _DEFINE_SPEC(_Order, _Trait, _Type, _Value) \
+ _DEFINE_SPEC_##_Order##_HELPER(_Trait<_Type>, _Value) \
+ _DEFINE_SPEC_##_Order##_HELPER(_Trait<_Type const>, _Value) \
+ _DEFINE_SPEC_##_Order##_HELPER(_Trait<_Type volatile>, _Value) \
+ _DEFINE_SPEC_##_Order##_HELPER(_Trait<_Type const volatile>, _Value)
/// @brief helper classes [4.3].
template<typename _Tp, _Tp __v>
@@ -76,33 +79,33 @@ namespace tr1
template<typename>
struct is_void
: public false_type { };
- _DEFINE_SPEC(0, is_void, void)
+ _DEFINE_SPEC(0, is_void, void, true)
template<typename>
struct is_integral
: public false_type { };
- _DEFINE_SPEC(0, is_integral, bool)
- _DEFINE_SPEC(0, is_integral, char)
- _DEFINE_SPEC(0, is_integral, signed char)
- _DEFINE_SPEC(0, is_integral, unsigned char)
+ _DEFINE_SPEC(0, is_integral, bool, true)
+ _DEFINE_SPEC(0, is_integral, char, true)
+ _DEFINE_SPEC(0, is_integral, signed char, true)
+ _DEFINE_SPEC(0, is_integral, unsigned char, true)
#ifdef _GLIBCXX_USE_WCHAR_T
- _DEFINE_SPEC(0, is_integral, wchar_t)
+ _DEFINE_SPEC(0, is_integral, wchar_t, true)
#endif
- _DEFINE_SPEC(0, is_integral, short)
- _DEFINE_SPEC(0, is_integral, unsigned short)
- _DEFINE_SPEC(0, is_integral, int)
- _DEFINE_SPEC(0, is_integral, unsigned int)
- _DEFINE_SPEC(0, is_integral, long)
- _DEFINE_SPEC(0, is_integral, unsigned long)
- _DEFINE_SPEC(0, is_integral, long long)
- _DEFINE_SPEC(0, is_integral, unsigned long long)
+ _DEFINE_SPEC(0, is_integral, short, true)
+ _DEFINE_SPEC(0, is_integral, unsigned short, true)
+ _DEFINE_SPEC(0, is_integral, int, true)
+ _DEFINE_SPEC(0, is_integral, unsigned int, true)
+ _DEFINE_SPEC(0, is_integral, long, true)
+ _DEFINE_SPEC(0, is_integral, unsigned long, true)
+ _DEFINE_SPEC(0, is_integral, long long, true)
+ _DEFINE_SPEC(0, is_integral, unsigned long long, true)
template<typename>
struct is_floating_point
: public false_type { };
- _DEFINE_SPEC(0, is_floating_point, float)
- _DEFINE_SPEC(0, is_floating_point, double)
- _DEFINE_SPEC(0, is_floating_point, long double)
+ _DEFINE_SPEC(0, is_floating_point, float, true)
+ _DEFINE_SPEC(0, is_floating_point, double, true)
+ _DEFINE_SPEC(0, is_floating_point, long double, true)
template<typename>
struct is_array
@@ -116,13 +119,10 @@ namespace tr1
struct is_array<_Tp[]>
: public true_type { };
-#define _DEFINE_SPEC_1_VAR \
- : public true_type { };
-
template<typename>
struct is_pointer
: public false_type { };
- _DEFINE_SPEC(1, is_pointer, _Tp*)
+ _DEFINE_SPEC(1, is_pointer, _Tp*, true)
template<typename>
struct is_reference
@@ -132,22 +132,17 @@ namespace tr1
struct is_reference<_Tp&>
: public true_type { };
-#define _DEFINE_SPEC_2_VAR \
- : public integral_constant<bool, !is_function<_Tp>::value> { };
-
template<typename>
struct is_member_object_pointer
: public false_type { };
- _DEFINE_SPEC(2, is_member_object_pointer, _Tp _Cp::*)
-
-#undef _DEFINE_SPEC_2_VAR
-#define _DEFINE_SPEC_2_VAR \
- : public integral_constant<bool, is_function<_Tp>::value> { };
+ _DEFINE_SPEC(2, is_member_object_pointer, _Tp _Cp::*,
+ !is_function<_Tp>::value)
template<typename>
struct is_member_function_pointer
: public false_type { };
- _DEFINE_SPEC(2, is_member_function_pointer, _Tp _Cp::*)
+ _DEFINE_SPEC(2, is_member_function_pointer, _Tp _Cp::*,
+ is_function<_Tp>::value)
template<typename _Tp, bool = (is_fundamental<_Tp>::value
|| is_array<_Tp>::value
@@ -410,14 +405,14 @@ namespace tr1
{ typedef typename remove_all_extents<_Tp>::type type; };
/// @brief pointer modifications [4.7.4].
-#undef _DEFINE_SPEC_1_VAR
-#define _DEFINE_SPEC_1_VAR \
+#undef _DEFINE_SPEC_BODY
+#define _DEFINE_SPEC_BODY(_Value) \
{ typedef _Tp type; };
template<typename _Tp>
struct remove_pointer
{ typedef _Tp type; };
- _DEFINE_SPEC(1, remove_pointer, _Tp*)
+ _DEFINE_SPEC(1, remove_pointer, _Tp*, false)
template<typename _Tp>
struct add_pointer
@@ -429,8 +424,7 @@ namespace tr1
#undef _DEFINE_SPEC_1_HELPER
#undef _DEFINE_SPEC_2_HELPER
#undef _DEFINE_SPEC
-#undef _DEFINE_SPEC_1_VAR
-#undef _DEFINE_SPEC_2_VAR
+#undef _DEFINE_SPEC_BODY
}
}