From cacd0a2ccff5b9e18996d4c4e46a936c4543db22 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Thu, 16 Dec 2004 11:35:56 +0000 Subject: [PATCH] type_traits: Implement is_function. 2004-12-16 Paolo Carlini * include/tr1/type_traits: Implement is_function. (struct __sfinae_types, struct __is_function_helper): New. * testsuite/tr1/4_metaprogramming/composite_type_traits/ is_object/is_object.cc: New. * testsuite/tr1/4_metaprogramming/composite_type_traits/ is_object/typedefs.cc: Likewise. * testsuite/tr1/4_metaprogramming/primary_type_categories/ is_function/is_function.cc: Likewise. * testsuite/tr1/4_metaprogramming/primary_type_categories/ is_function/typedefs.cc: Likewise. From-SVN: r92258 --- libstdc++-v3/ChangeLog | 13 +++++ libstdc++-v3/include/tr1/type_traits | 52 ++++++++++++++----- .../is_object/is_object.cc | 50 ++++++++++++++++++ .../is_object/typedefs.cc | 36 +++++++++++++ .../is_function/is_function.cc | 51 ++++++++++++++++++ .../is_function/typedefs.cc | 36 +++++++++++++ 6 files changed, 226 insertions(+), 12 deletions(-) create mode 100644 libstdc++-v3/testsuite/tr1/4_metaprogramming/composite_type_traits/is_object/is_object.cc create mode 100644 libstdc++-v3/testsuite/tr1/4_metaprogramming/composite_type_traits/is_object/typedefs.cc create mode 100644 libstdc++-v3/testsuite/tr1/4_metaprogramming/primary_type_categories/is_function/is_function.cc create mode 100644 libstdc++-v3/testsuite/tr1/4_metaprogramming/primary_type_categories/is_function/typedefs.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 6c047289129..6a8e4216307 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,16 @@ +2004-12-16 Paolo Carlini + + * include/tr1/type_traits: Implement is_function. + (struct __sfinae_types, struct __is_function_helper): New. + * testsuite/tr1/4_metaprogramming/composite_type_traits/ + is_object/is_object.cc: New. + * testsuite/tr1/4_metaprogramming/composite_type_traits/ + is_object/typedefs.cc: Likewise. + * testsuite/tr1/4_metaprogramming/primary_type_categories/ + is_function/is_function.cc: Likewise. + * testsuite/tr1/4_metaprogramming/primary_type_categories/ + is_function/typedefs.cc: Likewise. + 2004-12-13 Paolo Carlini * include/tr1/type_traits (extent): Minor tweak (i.e., public). diff --git a/libstdc++-v3/include/tr1/type_traits b/libstdc++-v3/include/tr1/type_traits index d994dfe3195..0e74d3ec0a2 100644 --- a/libstdc++-v3/include/tr1/type_traits +++ b/libstdc++-v3/include/tr1/type_traits @@ -28,21 +28,17 @@ #include #include -//namespace std::tr1 +// namespace std::tr1 namespace std { namespace tr1 { - /// @brief helper classes [4.3]. - template - struct integral_constant - { - static const _Tp value = __v; - typedef _Tp value_type; - typedef integral_constant<_Tp, __v> type; - }; - typedef integral_constant true_type; - typedef integral_constant false_type; + // For use in is_function and elsewhere. + struct __sfinae_types + { + typedef char __one; + typedef struct { char __arr[2]; } __two; + }; #define _DEFINE_SPEC_HELPER(_Header, _Spec) \ template _Header \ @@ -55,6 +51,17 @@ namespace tr1 _DEFINE_SPEC_HELPER(_Header, _Trait<_Type volatile>) \ _DEFINE_SPEC_HELPER(_Header, _Trait<_Type const volatile>) + /// @brief helper classes [4.3]. + template + struct integral_constant + { + static const _Tp value = __v; + typedef _Tp value_type; + typedef integral_constant<_Tp, __v> type; + }; + typedef integral_constant true_type; + typedef integral_constant false_type; + /// @brief primary type categories [4.5.1]. template struct is_void @@ -126,9 +133,30 @@ namespace tr1 template struct is_class; + + template + struct __is_function_helper + : public __sfinae_types + { + private: + template + static __one + __test(...); + + template + static __two + __test(_Up (*) [1]); + + public: + static const bool __value = sizeof(__test<_Tp>(0)) == 1; + }; template - struct is_function; + struct is_function + : public integral_constant::__value + && !is_reference<_Tp>::value + && !is_void<_Tp>::value)> + { }; /// @brief composite type traits [4.5.2]. template diff --git a/libstdc++-v3/testsuite/tr1/4_metaprogramming/composite_type_traits/is_object/is_object.cc b/libstdc++-v3/testsuite/tr1/4_metaprogramming/composite_type_traits/is_object/is_object.cc new file mode 100644 index 00000000000..99925d067a6 --- /dev/null +++ b/libstdc++-v3/testsuite/tr1/4_metaprogramming/composite_type_traits/is_object/is_object.cc @@ -0,0 +1,50 @@ +// 2004-12-16 Paolo Carlini +// +// Copyright (C) 2004 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// 4.5.2 Composite type traits + +#include +#include +#include + +void test01() +{ + bool test __attribute__((unused)) = true; + using std::tr1::is_object; + using namespace __gnu_test; + + VERIFY( (test_category(false)) ); + VERIFY( (test_category(false)) ); + VERIFY( (test_category(false)) ); + VERIFY( (test_category(false)) ); + VERIFY( (test_category(false)) ); + VERIFY( (test_category(false)) ); + VERIFY( (test_category(false)) ); + VERIFY( (test_category(false)) ); + + // Sanity check. + VERIFY( (test_category(true)) ); +} + +int main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/tr1/4_metaprogramming/composite_type_traits/is_object/typedefs.cc b/libstdc++-v3/testsuite/tr1/4_metaprogramming/composite_type_traits/is_object/typedefs.cc new file mode 100644 index 00000000000..a9529223e4b --- /dev/null +++ b/libstdc++-v3/testsuite/tr1/4_metaprogramming/composite_type_traits/is_object/typedefs.cc @@ -0,0 +1,36 @@ +// 2004-12-16 Paolo Carlini +// +// Copyright (C) 2004 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// +// NB: This file is for testing tr1/type_traits with NO OTHER INCLUDES. + +#include + +// { dg-do compile } + +void test01() +{ + // Check for required typedefs + typedef std::tr1::is_object test_type; + typedef test_type::value_type value_type; + typedef test_type::type type; + typedef test_type::type::value_type type_value_type; + typedef test_type::type::type type_type; +} diff --git a/libstdc++-v3/testsuite/tr1/4_metaprogramming/primary_type_categories/is_function/is_function.cc b/libstdc++-v3/testsuite/tr1/4_metaprogramming/primary_type_categories/is_function/is_function.cc new file mode 100644 index 00000000000..0f79758b58d --- /dev/null +++ b/libstdc++-v3/testsuite/tr1/4_metaprogramming/primary_type_categories/is_function/is_function.cc @@ -0,0 +1,51 @@ +// 2004-12-16 Paolo Carlini +// +// Copyright (C) 2004 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// 4.5.1 Primary type categories + +#include +#include +#include + +void test01() +{ + bool test __attribute__((unused)) = true; + using std::tr1::is_function; + using namespace __gnu_test; + + // Positive tests. + VERIFY( (test_category(true)) ); + VERIFY( (test_category(true)) ); + VERIFY( (test_category(true)) ); + + // Negative tests. + VERIFY( (test_category(false)) ); + VERIFY( (test_category(false)) ); + VERIFY( (test_category(false)) ); + + // Sanity check. + VERIFY( (test_category(false)) ); +} + +int main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/tr1/4_metaprogramming/primary_type_categories/is_function/typedefs.cc b/libstdc++-v3/testsuite/tr1/4_metaprogramming/primary_type_categories/is_function/typedefs.cc new file mode 100644 index 00000000000..805b805370d --- /dev/null +++ b/libstdc++-v3/testsuite/tr1/4_metaprogramming/primary_type_categories/is_function/typedefs.cc @@ -0,0 +1,36 @@ +// 2004-12-16 Paolo Carlini +// +// Copyright (C) 2004 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// +// NB: This file is for testing tr1/type_traits with NO OTHER INCLUDES. + +#include + +// { dg-do compile } + +void test01() +{ + // Check for required typedefs + typedef std::tr1::is_function test_type; + typedef test_type::value_type value_type; + typedef test_type::type type; + typedef test_type::type::value_type type_value_type; + typedef test_type::type::type type_type; +}