diff options
author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-10-06 17:17:16 +0000 |
---|---|---|
committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-10-06 17:17:16 +0000 |
commit | 835e1464c1ebe3b70b1546928c2c51fb64f51ab6 (patch) | |
tree | 619ca9a1c53872403240f1d89461f35d6d93bbc4 /libstdc++-v3 | |
parent | 562ffb7de54639a07e89e972fb075f6ccc4e2420 (diff) | |
download | gcc-835e1464c1ebe3b70b1546928c2c51fb64f51ab6.tar.gz |
2010-10-06 Paolo Carlini <paolo.carlini@oracle.com>
* include/std/functional (struct _Weak_result_type_impl): Add
specializazions for cv-qualified function types, for variadic
function types and pointers and references to function types,
and for pointers to member function types.
(struct _Reference_wrapper_base): Add specializations for
cv-qualified unary and binary function types.
* testsuite/20_util/reference_wrapper/result_type.cc: New.
* testsuite/20_util/reference_wrapper/typedefs-2.cc: Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@165056 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/ChangeLog | 11 | ||||
-rw-r--r-- | libstdc++-v3/include/std/functional | 146 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/20_util/reference_wrapper/result_type.cc | 42 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/20_util/reference_wrapper/typedefs-2.cc | 69 |
4 files changed, 229 insertions, 39 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 0f3c8535285..bd06501440c 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,14 @@ +2010-10-06 Paolo Carlini <paolo.carlini@oracle.com> + + * include/std/functional (struct _Weak_result_type_impl): Add + specializazions for cv-qualified function types, for variadic + function types and pointers and references to function types, + and for pointers to member function types. + (struct _Reference_wrapper_base): Add specializations for + cv-qualified unary and binary function types. + * testsuite/20_util/reference_wrapper/result_type.cc: New. + * testsuite/20_util/reference_wrapper/typedefs-2.cc: Likewise. + 2010-10-06 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> PR libstdc++/45863 diff --git a/libstdc++-v3/include/std/functional b/libstdc++-v3/include/std/functional index f781d9e0477..33fe07284ac 100644 --- a/libstdc++-v3/include/std/functional +++ b/libstdc++-v3/include/std/functional @@ -60,9 +60,6 @@ namespace std { - template<typename _MemberPointer> - class _Mem_fn; - _GLIBCXX_HAS_NESTED_TYPE(result_type) /// If we have found a result_type, extract it. @@ -72,9 +69,7 @@ _GLIBCXX_HAS_NESTED_TYPE(result_type) template<typename _Functor> struct _Maybe_get_result_type<true, _Functor> - { - typedef typename _Functor::result_type result_type; - }; + { typedef typename _Functor::result_type result_type; }; /** * Base class for any function object that has a weak result type, as @@ -88,51 +83,91 @@ _GLIBCXX_HAS_NESTED_TYPE(result_type) /// Retrieve the result type for a function type. template<typename _Res, typename... _ArgTypes> struct _Weak_result_type_impl<_Res(_ArgTypes...)> - { - typedef _Res result_type; - }; + { typedef _Res result_type; }; + + template<typename _Res, typename... _ArgTypes> + struct _Weak_result_type_impl<_Res(_ArgTypes......)> + { typedef _Res result_type; }; + + template<typename _Res, typename... _ArgTypes> + struct _Weak_result_type_impl<_Res(_ArgTypes...) const> + { typedef _Res result_type; }; + + template<typename _Res, typename... _ArgTypes> + struct _Weak_result_type_impl<_Res(_ArgTypes......) const> + { typedef _Res result_type; }; + + template<typename _Res, typename... _ArgTypes> + struct _Weak_result_type_impl<_Res(_ArgTypes...) volatile> + { typedef _Res result_type; }; + + template<typename _Res, typename... _ArgTypes> + struct _Weak_result_type_impl<_Res(_ArgTypes......) volatile> + { typedef _Res result_type; }; + + template<typename _Res, typename... _ArgTypes> + struct _Weak_result_type_impl<_Res(_ArgTypes...) const volatile> + { typedef _Res result_type; }; + + template<typename _Res, typename... _ArgTypes> + struct _Weak_result_type_impl<_Res(_ArgTypes......) const volatile> + { typedef _Res result_type; }; /// Retrieve the result type for a function reference. template<typename _Res, typename... _ArgTypes> struct _Weak_result_type_impl<_Res(&)(_ArgTypes...)> - { - typedef _Res result_type; - }; + { typedef _Res result_type; }; + + template<typename _Res, typename... _ArgTypes> + struct _Weak_result_type_impl<_Res(&)(_ArgTypes......)> + { typedef _Res result_type; }; /// Retrieve the result type for a function pointer. template<typename _Res, typename... _ArgTypes> struct _Weak_result_type_impl<_Res(*)(_ArgTypes...)> - { - typedef _Res result_type; - }; + { typedef _Res result_type; }; + + template<typename _Res, typename... _ArgTypes> + struct _Weak_result_type_impl<_Res(*)(_ArgTypes......)> + { typedef _Res result_type; }; /// Retrieve result type for a member function pointer. template<typename _Res, typename _Class, typename... _ArgTypes> struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...)> - { - typedef _Res result_type; - }; + { typedef _Res result_type; }; + + template<typename _Res, typename _Class, typename... _ArgTypes> + struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes......)> + { typedef _Res result_type; }; /// Retrieve result type for a const member function pointer. template<typename _Res, typename _Class, typename... _ArgTypes> struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...) const> - { - typedef _Res result_type; - }; + { typedef _Res result_type; }; + + template<typename _Res, typename _Class, typename... _ArgTypes> + struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes......) const> + { typedef _Res result_type; }; /// Retrieve result type for a volatile member function pointer. template<typename _Res, typename _Class, typename... _ArgTypes> struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...) volatile> - { - typedef _Res result_type; - }; + { typedef _Res result_type; }; + + template<typename _Res, typename _Class, typename... _ArgTypes> + struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes......) volatile> + { typedef _Res result_type; }; /// Retrieve result type for a const volatile member function pointer. template<typename _Res, typename _Class, typename... _ArgTypes> - struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...)const volatile> - { - typedef _Res result_type; - }; + struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes...) + const volatile> + { typedef _Res result_type; }; + + template<typename _Res, typename _Class, typename... _ArgTypes> + struct _Weak_result_type_impl<_Res (_Class::*)(_ArgTypes......) + const volatile> + { typedef _Res result_type; }; /** * Strip top-level cv-qualifiers from the function object and let @@ -280,12 +315,42 @@ _GLIBCXX_HAS_NESTED_TYPE(result_type) : unary_function<_T1, _Res> { }; + template<typename _Res, typename _T1> + struct _Reference_wrapper_base<_Res(_T1) const> + : unary_function<_T1, _Res> + { }; + + template<typename _Res, typename _T1> + struct _Reference_wrapper_base<_Res(_T1) volatile> + : unary_function<_T1, _Res> + { }; + + template<typename _Res, typename _T1> + struct _Reference_wrapper_base<_Res(_T1) const volatile> + : unary_function<_T1, _Res> + { }; + // - a function type (binary) template<typename _Res, typename _T1, typename _T2> struct _Reference_wrapper_base<_Res(_T1, _T2)> : binary_function<_T1, _T2, _Res> { }; + template<typename _Res, typename _T1, typename _T2> + struct _Reference_wrapper_base<_Res(_T1, _T2) const> + : binary_function<_T1, _T2, _Res> + { }; + + template<typename _Res, typename _T1, typename _T2> + struct _Reference_wrapper_base<_Res(_T1, _T2) volatile> + : binary_function<_T1, _T2, _Res> + { }; + + template<typename _Res, typename _T1, typename _T2> + struct _Reference_wrapper_base<_Res(_T1, _T2) const volatile> + : binary_function<_T1, _T2, _Res> + { }; + // - a function pointer type (unary) template<typename _Res, typename _T1> struct _Reference_wrapper_base<_Res(*)(_T1)> @@ -423,17 +488,8 @@ _GLIBCXX_HAS_NESTED_TYPE(result_type) // @} group functors - template<typename _Tp, bool> - struct _Mem_fn_const_or_non - { - typedef const _Tp& type; - }; - - template<typename _Tp> - struct _Mem_fn_const_or_non<_Tp, false> - { - typedef _Tp& type; - }; + template<typename _MemberPointer> + class _Mem_fn; /** * Derives from @c unary_function or @c binary_function, or perhaps @@ -639,6 +695,18 @@ _GLIBCXX_HAS_NESTED_TYPE(result_type) }; + template<typename _Tp, bool> + struct _Mem_fn_const_or_non + { + typedef const _Tp& type; + }; + + template<typename _Tp> + struct _Mem_fn_const_or_non<_Tp, false> + { + typedef _Tp& type; + }; + template<typename _Res, typename _Class> class _Mem_fn<_Res _Class::*> { diff --git a/libstdc++-v3/testsuite/20_util/reference_wrapper/result_type.cc b/libstdc++-v3/testsuite/20_util/reference_wrapper/result_type.cc new file mode 100644 index 00000000000..911e9a944ad --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/reference_wrapper/result_type.cc @@ -0,0 +1,42 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// 2010-10-06 Paolo Carlini <paolo.carlini@oracle.com> + +// Copyright (C) 2010 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 3, 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 COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +#include <functional> + +using namespace std; + +struct T; + +reference_wrapper<int(float, ...)>::result_type i01; +reference_wrapper<int(float, ...) const>::result_type i02; +reference_wrapper<int(float, ...) volatile>::result_type i03; +reference_wrapper<int(float, ...) const volatile>::result_type i04; + +reference_wrapper<int(*)(float, ...)>::result_type i05; +reference_wrapper<int(* const)(float, ...)>::result_type i06; +reference_wrapper<int(* volatile)(float, ...)>::result_type i07; +reference_wrapper<int(* const volatile)(float, ...)>::result_type i08; + +reference_wrapper<int(T::*)(float, ...)>::result_type i09; +reference_wrapper<int(T::*)(float, ...) const>::result_type i10; +reference_wrapper<int(T::*)(float, ...) volatile>::result_type i11; +reference_wrapper<int(T::*)(float, ...) const volatile>::result_type i12; diff --git a/libstdc++-v3/testsuite/20_util/reference_wrapper/typedefs-2.cc b/libstdc++-v3/testsuite/20_util/reference_wrapper/typedefs-2.cc new file mode 100644 index 00000000000..8b1b7e3f14e --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/reference_wrapper/typedefs-2.cc @@ -0,0 +1,69 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// 2010-10-06 Paolo Carlini <paolo.carlini@oracle.com> + +// Copyright (C) 2010 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 3, 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 COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +#include <functional> + +using namespace std; + +reference_wrapper<int(float)>::argument_type i01; +reference_wrapper<int(float) const>::argument_type i02; +reference_wrapper<int(float) volatile>::argument_type i03; +reference_wrapper<int(float) const volatile>::argument_type i04; +reference_wrapper<int(float)>::result_type i05; +reference_wrapper<int(float) const>::result_type i06; +reference_wrapper<int(float) volatile>::result_type i07; +reference_wrapper<int(float) const volatile>::result_type i08; + +reference_wrapper<int(*)(float)>::argument_type i09; +reference_wrapper<int(* const)(float)>::argument_type i10; +reference_wrapper<int(* volatile)(float)>::argument_type i11; +reference_wrapper<int(* const volatile)(float)>::argument_type i12; +reference_wrapper<int(*)(float)>::result_type i13; +reference_wrapper<int(* const)(float)>::result_type i14; +reference_wrapper<int(* volatile)(float)>::result_type i15; +reference_wrapper<int(* const volatile)(float)>::result_type i16; + +reference_wrapper<int(float, char)>::first_argument_type i17; +reference_wrapper<int(float, char) const>::first_argument_type i18; +reference_wrapper<int(float, char) volatile>::first_argument_type i19; +reference_wrapper<int(float, char) const volatile>::first_argument_type i20; +reference_wrapper<int(float, char)>::second_argument_type i21; +reference_wrapper<int(float, char) const>::second_argument_type i22; +reference_wrapper<int(float, char) volatile>::second_argument_type i23; +reference_wrapper<int(float, char) const volatile>::second_argument_type i24; +reference_wrapper<int(float, char)>::result_type i25; +reference_wrapper<int(float, char) const>::result_type i26; +reference_wrapper<int(float, char) volatile>::result_type i27; +reference_wrapper<int(float, char) const volatile>::result_type i28; + +reference_wrapper<int(*)(float, char)>::first_argument_type i29; +reference_wrapper<int(* const)(float, char)>::first_argument_type i30; +reference_wrapper<int(* volatile)(float, char)>::first_argument_type i31; +reference_wrapper<int(* const volatile)(float, char)>::first_argument_type i32; +reference_wrapper<int(*)(float, char)>::second_argument_type i33; +reference_wrapper<int(* const)(float, char)>::second_argument_type i34; +reference_wrapper<int(* volatile)(float, char)>::second_argument_type i35; +reference_wrapper<int(*const volatile)(float, char)>::second_argument_type i36; +reference_wrapper<int(*)(float, char)>::result_type i37; +reference_wrapper<int(* const)(float, char)>::result_type i38; +reference_wrapper<int(* volatile)(float, char)>::result_type i39; +reference_wrapper<int(* const volatile)(float, char)>::result_type i40; |