diff options
author | dgregor <dgregor@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-03-02 12:56:28 +0000 |
---|---|---|
committer | dgregor <dgregor@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-03-02 12:56:28 +0000 |
commit | 0875e2d5acec793f2f9374650c497c58497e0230 (patch) | |
tree | 5e2e64883bf5fcdc589a92880840a165ed314e0e /libstdc++-v3/testsuite/tr1 | |
parent | bb4c7a44377ffbc0967d80916cae0cd8dc3b2f85 (diff) | |
download | gcc-0875e2d5acec793f2f9374650c497c58497e0230.tar.gz |
2005-03-02 Douglas Gregor <doug.gregor@gmail.com>
* include/tr1/functional (_Has_result_type): Cleanup.
(_Result_of_impl): Handle member data pointers correctly.
(reference_wrapper): Support invocation.
Move repetition code into new file include/tr1/repeat.h.
* include/tr1/functional_iterate.h (reference_wrapper): Support
invocation. Cleanup long lines.
* include/tr1/ref_wrap_iterate.h (reference_wrapper): Declare
invocation operators.
* include/tr1/repeat.h: Code repetition header.
* include/Makefile.am: Add ref_wrap_iterate.h, repeat.h
* include/Makefile.in: Add ref_wrap_iterate.h, repeat.h
* testsuite/tr1/3_function_objects/reference_wrapper/invoke.cc:
New test of reference_wrapper invocation.
* testsuite/tr1/3_function_objects/reference_wrapper/typedefs.cc:
New test of reference_wrapper typedefs and base classes.
* testsuite/tr1/3_function_objects/result_of.cc: Trivial cleanup
(e-mail address).
2005-03-02 Douglas Gregor <doug.gregor@gmail.com>
* include/tr1/function (result_of): New class template.
* include/tr1/functional/iterator.h: Implementation of TR1
result_of.
* testsuite/tr1/3_function_objects/result_of.cc: New test
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@95778 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/testsuite/tr1')
3 files changed, 267 insertions, 0 deletions
diff --git a/libstdc++-v3/testsuite/tr1/3_function_objects/reference_wrapper/invoke.cc b/libstdc++-v3/testsuite/tr1/3_function_objects/reference_wrapper/invoke.cc new file mode 100644 index 00000000000..255fc9f6774 --- /dev/null +++ b/libstdc++-v3/testsuite/tr1/3_function_objects/reference_wrapper/invoke.cc @@ -0,0 +1,103 @@ +// 2005-02-27 Douglas Gregor <doug.gregor -at- gmail.com> +// +// Copyright (C) 2005 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. + +// 2.1 reference wrappers +#include <tr1/functional> +#include <tr1/type_traits> +#include <testsuite_hooks.h> +#include <testsuite_tr1.h> + +using namespace __gnu_test; + +bool test __attribute__((unused)) = true; + +struct X +{ + typedef int result_type; + + X() : bar(17) {} + + int foo(float x) { return truncate_float(x); } + int foo_c(float x) const { return truncate_float(x); } + int foo_v(float x) volatile { return truncate_float(x); } + int foo_cv(float x) const volatile { return truncate_float(x); } + + int operator()(float x) + { + return foo(x) + 1; + } + + int operator()(float x) const + { + return foo_c(x) + 2; + } + + int bar; + + private: + X(const X&); + X& operator=(const X&); +}; + +void test01() +{ + using std::tr1::ref; + using std::tr1::cref; + + ::X x; + ::X* xp = &x; + int (::X::* p_foo)(float) = &::X::foo; + int (::X::* p_foo_c)(float) const = &::X::foo_c; + int (::X::* p_foo_v)(float) volatile = &::X::foo_v; + int (::X::* p_foo_cv)(float) const volatile = &::X::foo_cv; + int ::X::* p_bar = &::X::bar; + + const float pi = 3.14; + + // Functions + VERIFY(ref(truncate_float)(pi) == 3); + + // Function pointers + VERIFY(cref(&truncate_float)(pi) == 3); + + // Member function pointers + VERIFY(ref(p_foo)(x, pi) == 3); + VERIFY(ref(p_foo)(xp, pi) == 3); + VERIFY(ref(p_foo_c)(x, pi) == 3); + VERIFY(ref(p_foo_c)(xp, pi) == 3); + VERIFY(ref(p_foo_v)(x, pi) == 3); + VERIFY(ref(p_foo_v)(xp, pi) == 3); + VERIFY(ref(p_foo_cv)(x, pi) == 3); + VERIFY(ref(p_foo_cv)(xp, pi) == 3); + + // Member data pointers + VERIFY(ref(p_bar)(x) == 17); + VERIFY(ref(p_bar)(xp) == 17); + + // Function objects + VERIFY(ref(x)(pi) == 4); + VERIFY(cref(x)(pi) == 5); +} + +int main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/tr1/3_function_objects/reference_wrapper/typedefs.cc b/libstdc++-v3/testsuite/tr1/3_function_objects/reference_wrapper/typedefs.cc new file mode 100644 index 00000000000..3aa427d6dcc --- /dev/null +++ b/libstdc++-v3/testsuite/tr1/3_function_objects/reference_wrapper/typedefs.cc @@ -0,0 +1,89 @@ +// 2005-02-27 Douglas Gregor <doug.gregor -at- gmail.com> +// +// Copyright (C) 2005 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. + +// 2.1 reference wrappers +#include <tr1/functional> +#include <tr1/type_traits> +#include <testsuite_hooks.h> +#include <testsuite_tr1.h> + +using namespace __gnu_test; + +struct X {}; + +struct int_result_type { typedef int result_type; }; + +struct derives_unary : std::unary_function<int, int> {}; + +struct derives_binary : std::binary_function<int, float, int> {}; + +struct derives_unary_binary + : std::unary_function<int, int>, + std::binary_function<int, float, int> +{ + typedef int result_type; +}; + +void test01() +{ + bool test __attribute__((unused)) = true; + + using std::tr1::reference_wrapper; + using std::tr1::is_same; + using std::tr1::is_convertible; + using std::unary_function; + using std::binary_function; + + // Check result_type typedef + VERIFY((is_same<reference_wrapper<int_result_type>::result_type, int>::value)); + VERIFY((is_same<reference_wrapper<derives_unary>::result_type, int>::value)); + VERIFY((is_same<reference_wrapper<derives_binary>::result_type, int>::value)); + VERIFY((is_same<reference_wrapper<derives_unary_binary>::result_type, int>::value)); + VERIFY((is_same<reference_wrapper<int(void)>::result_type, int>::value)); + VERIFY((is_same<reference_wrapper<int(*)(void)>::result_type, int>::value)); + VERIFY((is_same<reference_wrapper<int (::X::*)()>::result_type, int>::value)); + VERIFY((is_same<reference_wrapper<int (::X::*)(float)>::result_type, int>::value)); + + // Check derivation from unary_function + VERIFY((is_convertible<reference_wrapper<derives_unary>*, unary_function<int, int>*>::value)); + VERIFY((is_convertible<reference_wrapper<derives_unary_binary>*, unary_function<int, int>*>::value)); + VERIFY((is_convertible<reference_wrapper<int(int)>*, unary_function<int, int>*>::value)); + VERIFY((is_convertible<reference_wrapper<int(*)(int)>*, unary_function<int, int>*>::value)); + VERIFY((is_convertible<reference_wrapper<int (::X::*)()>*, unary_function< ::X*, int>*>::value)); + VERIFY((is_convertible<reference_wrapper<int (::X::*)() const>*, unary_function<const ::X*, int>*>::value)); + VERIFY((is_convertible<reference_wrapper<int (::X::*)() volatile>*, unary_function<volatile ::X*, int>*>::value)); + VERIFY((is_convertible<reference_wrapper<int (::X::*)() const volatile>*, unary_function<const volatile ::X*, int>*>::value)); + + // Check derivation from binary_function + VERIFY((is_convertible<reference_wrapper<derives_binary>*, binary_function<int, float, int>*>::value)); + VERIFY((is_convertible<reference_wrapper<derives_unary_binary>*, binary_function<int, float, int>*>::value)); + VERIFY((is_convertible<reference_wrapper<int(int, float)>*, binary_function<int, float, int>*>::value)); + VERIFY((is_convertible<reference_wrapper<int(*)(int, float)>*, binary_function<int, float, int>*>::value)); + VERIFY((is_convertible<reference_wrapper<int (::X::*)(float)>*, binary_function< ::X*, float, int>*>::value)); + VERIFY((is_convertible<reference_wrapper<int (::X::*)(float) const>*, binary_function<const ::X*, float, int>*>::value)); + VERIFY((is_convertible<reference_wrapper<int (::X::*)(float) volatile>*, binary_function<volatile ::X*, float, int>*>::value)); + VERIFY((is_convertible<reference_wrapper<int (::X::*)(float) const volatile>*, binary_function<const volatile ::X*, float, int>*>::value)); +} + +int main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/tr1/3_function_objects/result_of.cc b/libstdc++-v3/testsuite/tr1/3_function_objects/result_of.cc new file mode 100644 index 00000000000..bf17f8407bf --- /dev/null +++ b/libstdc++-v3/testsuite/tr1/3_function_objects/result_of.cc @@ -0,0 +1,75 @@ +// 2005-01-26 Douglas Gregor <doug.gregor -at- gmail.com> +// +// Copyright (C) 2005 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. + +// 3.4 function return types +#include <tr1/functional> +#include <tr1/type_traits> +#include <testsuite_hooks.h> +#include <testsuite_tr1.h> + +class X {}; + +struct int_result_type { typedef int result_type; }; + +struct int_result_of +{ + template<typename F> struct result { typedef int type; }; +}; + +struct int_result_type_and_float_result_of +{ + typedef int result_type; + template<typename F> struct result { typedef float type; }; +}; + +void test01() +{ + bool test __attribute__((unused)) = true; + + using std::tr1::result_of; + using std::tr1::is_same; + using namespace __gnu_test; + + typedef int (*func_ptr)(float, double); + typedef int (&func_ref)(float, double); + typedef int (::X::*mem_func_ptr)(float); + typedef int (::X::*mem_func_ptr_c)(float) const; + typedef int (::X::*mem_func_ptr_v)(float) volatile; + typedef int (::X::*mem_func_ptr_cv)(float) const volatile; + + VERIFY((is_same<result_of<int_result_type(float)>::type, int>::value)); + VERIFY((is_same<result_of<int_result_of(double)>::type, int>::value)); + VERIFY((is_same<result_of<int_result_of(void)>::type, void>::value)); + VERIFY((is_same<result_of<const int_result_of(double)>::type, int>::value)); + VERIFY((is_same<result_of<volatile int_result_of(void)>::type, void>::value)); + VERIFY((is_same<result_of<int_result_type_and_float_result_of(char)>::type, int>::value)); + VERIFY((is_same<result_of<func_ptr(char, float)>::type, int>::value)); + VERIFY((is_same<result_of<func_ref(char, float)>::type, int>::value)); + VERIFY((is_same<result_of<mem_func_ptr(::X,char)>::type, int>::value)); + VERIFY((is_same<result_of<mem_func_ptr_c(::X,char)>::type, int>::value)); + VERIFY((is_same<result_of<mem_func_ptr_v(::X,char)>::type, int>::value)); + VERIFY((is_same<result_of<mem_func_ptr_cv(::X,char)>::type, int>::value)); +} + +int main() +{ + test01(); + return 0; +} |