]> gcc.gnu.org Git - gcc.git/commitdiff
type_traits: Rework the _DEFINE_SPEC* macros.
authorPaolo Carlini <pcarlini@suse.de>
Mon, 27 Dec 2004 18:51:12 +0000 (18:51 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 27 Dec 2004 18:51:12 +0000 (18:51 +0000)
2004-12-27  Paolo Carlini  <pcarlini@suse.de>

* include/tr1/type_traits: Rework the _DEFINE_SPEC* macros.

From-SVN: r92647

libstdc++-v3/ChangeLog
libstdc++-v3/include/tr1/type_traits

index 63e54f7fe8d3d6c0a62a0cf6e18740b99b4416e1..ba4b65ec707b4f8d0931b26c023b3de832c9363a 100644 (file)
@@ -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,
index 7b15b179e23cb599b063aeb985c5b719a38ea083..d035a197b78c4d35724a7db3ee78dd42c29353c0 100644 (file)
@@ -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
 
 }
 }
This page took 0.076735 seconds and 5 git commands to generate.