diff options
author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-12-16 11:35:56 +0000 |
---|---|---|
committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-12-16 11:35:56 +0000 |
commit | 8cf594f83e5dc194ddd23a0de16b8c49a3d2c9b9 (patch) | |
tree | 9143061946f2e29d072ea75e0268d0fa900d2166 /libstdc++-v3 | |
parent | 13f0eb203f1c4d5cfb52f559ab84725160d89f2e (diff) | |
download | gcc-8cf594f83e5dc194ddd23a0de16b8c49a3d2c9b9.tar.gz |
2004-12-16 Paolo Carlini <pcarlini@suse.de>
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@92258 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
6 files changed, 226 insertions, 12 deletions
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 <pcarlini@suse.de> + + * 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 <pcarlini@suse.de> * 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 <bits/c++config.h> #include <cstddef> -//namespace std::tr1 +// namespace std::tr1 namespace std { namespace tr1 { - /// @brief helper classes [4.3]. - template<typename _Tp, _Tp __v> - struct integral_constant - { - static const _Tp value = __v; - typedef _Tp value_type; - typedef integral_constant<_Tp, __v> type; - }; - typedef integral_constant<bool, true> true_type; - typedef integral_constant<bool, false> 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<typename _Tp, _Tp __v> + struct integral_constant + { + static const _Tp value = __v; + typedef _Tp value_type; + typedef integral_constant<_Tp, __v> type; + }; + typedef integral_constant<bool, true> true_type; + typedef integral_constant<bool, false> false_type; + /// @brief primary type categories [4.5.1]. template<typename> struct is_void @@ -126,9 +133,30 @@ namespace tr1 template<typename _Tp> struct is_class; + + template<typename _Tp> + struct __is_function_helper + : public __sfinae_types + { + private: + template<typename> + static __one + __test(...); + + template<typename _Up> + static __two + __test(_Up (*) [1]); + + public: + static const bool __value = sizeof(__test<_Tp>(0)) == 1; + }; template<typename _Tp> - struct is_function; + struct is_function + : public integral_constant<bool, (__is_function_helper<_Tp>::__value + && !is_reference<_Tp>::value + && !is_void<_Tp>::value)> + { }; /// @brief composite type traits [4.5.2]. template<typename _Tp> 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 <pcarlini@suse.de> +// +// 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 <tr1/type_traits> +#include <testsuite_hooks.h> +#include <testsuite_tr1.h> + +void test01() +{ + bool test __attribute__((unused)) = true; + using std::tr1::is_object; + using namespace __gnu_test; + + VERIFY( (test_category<is_object, int (int)>(false)) ); + VERIFY( (test_category<is_object, ClassType (ClassType)>(false)) ); + VERIFY( (test_category<is_object, float (int, float, int[], int&)>(false)) ); + VERIFY( (test_category<is_object, int&>(false)) ); + VERIFY( (test_category<is_object, ClassType&>(false)) ); + VERIFY( (test_category<is_object, int(&)(int)>(false)) ); + VERIFY( (test_category<is_object, void>(false)) ); + VERIFY( (test_category<is_object, const void>(false)) ); + + // Sanity check. + VERIFY( (test_category<is_object, ClassType>(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 <pcarlini@suse.de> +// +// 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 <tr1/type_traits> + +// { dg-do compile } + +void test01() +{ + // Check for required typedefs + typedef std::tr1::is_object<int> 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 <pcarlini@suse.de> +// +// 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 <tr1/type_traits> +#include <testsuite_hooks.h> +#include <testsuite_tr1.h> + +void test01() +{ + bool test __attribute__((unused)) = true; + using std::tr1::is_function; + using namespace __gnu_test; + + // Positive tests. + VERIFY( (test_category<is_function, int (int)>(true)) ); + VERIFY( (test_category<is_function, ClassType (ClassType)>(true)) ); + VERIFY( (test_category<is_function, float (int, float, int[], int&)>(true)) ); + + // Negative tests. + VERIFY( (test_category<is_function, int&>(false)) ); + VERIFY( (test_category<is_function, void>(false)) ); + VERIFY( (test_category<is_function, const void>(false)) ); + + // Sanity check. + VERIFY( (test_category<is_function, ClassType>(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 <pcarlini@suse.de> +// +// 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 <tr1/type_traits> + +// { dg-do compile } + +void test01() +{ + // Check for required typedefs + typedef std::tr1::is_function<int> 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; +} |