1 // 2005-01-15 Douglas Gregor <dgregor@cs.indiana.edu>
2 //
3 // Copyright (C) 2005-2018 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library.  This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 // GNU General Public License for more details.
15 //
16 // You should have received a copy of the GNU General Public License along
17 // with this library; see the file COPYING3.  If not see
18 // <http://www.gnu.org/licenses/>.
19 
20 // 3.7.2 polymorphic function object wrapper
21 #include <tr1/functional>
22 #include <testsuite_hooks.h>
23 #include <testsuite_tr1.h>
24 
25 using namespace __gnu_test;
26 
27 // Put member pointers into function<> wrappers
test05()28 void test05()
29 {
30   using std::tr1::function;
31 
32   X x;
33   x.bar = 17;
34 
35   function<int(X&)> frm(&X::bar);
36   VERIFY( frm );
37   VERIFY( frm(x) == 17 );
38   VERIFY( typeid(int X::*) == frm.target_type() );
39   VERIFY( *frm.target<int X::*>() == &X::bar );
40 
41   function<int(X&)> fr(&X::foo);
42   VERIFY( fr );
43   VERIFY( fr(x) == 1 );
44   VERIFY( typeid(int (X::*)()) == fr.target_type() );
45   VERIFY( *fr.target<int (X::*)()>() == &X::foo );
46 
47   function<int(const X&)> frc(&X::foo_c);
48   VERIFY( frc );
49   VERIFY( frc(x) == 2 );
50   VERIFY( typeid(int (X::*)() const) == frc.target_type() );
51   VERIFY( *frc.target<int (X::*)() const >() == &X::foo_c );
52 
53   function<int(volatile X&)> frv(&X::foo_v);
54   VERIFY( frv );
55   VERIFY( frv(x) == 3 );
56   VERIFY( typeid(int (X::*)() volatile) == frv.target_type() );
57   VERIFY( *frv.target<int (X::*)() volatile >() == &X::foo_v );
58   VERIFY( frv.target<int (X::*)() const volatile>() == 0 );
59 
60   function<int(const volatile X&)> frcv(&X::foo_cv);
61   VERIFY( frcv );
62   VERIFY( frcv(x) == 4 );
63   VERIFY( typeid(int (X::*)() const volatile) == frcv.target_type() );
64   VERIFY( *frcv.target<int (X::*)() const volatile >() == &X::foo_cv );
65   VERIFY( frcv.target<int (X::*)() const>() == 0 );
66 
67   function<int(X*)> grm(&X::bar);
68   VERIFY( grm );
69   VERIFY( grm(&x) == 17 );
70   VERIFY( typeid(int X::*) == grm.target_type() );
71   VERIFY( *grm.target<int X::*>() == &X::bar );
72 
73   function<int(X*)> gr(&X::foo);
74   VERIFY( gr );
75   VERIFY( gr(&x) == 1 );
76   VERIFY( typeid(int (X::*)()) == gr.target_type() );
77   VERIFY( *gr.target<int (X::*)()>() == &X::foo );
78 
79   function<int(const X*)> grc(&X::foo_c);
80   VERIFY( grc );
81   VERIFY( grc(&x) == 2 );
82   VERIFY( typeid(int (X::*)() const) == grc.target_type() );
83   VERIFY( *grc.target<int (X::*)() const >() == &X::foo_c );
84 
85   function<int(volatile X*)> grv(&X::foo_v);
86   VERIFY( grv );
87   VERIFY( grv(&x) == 3 );
88   VERIFY( typeid(int (X::*)() volatile) == grv.target_type() );
89   VERIFY( *grv.target<int (X::*)() volatile >() == &X::foo_v );
90   VERIFY( grv.target<int (X::*)() const volatile>() == 0 );
91 
92   function<int(const volatile X*)> grcv(&X::foo_cv);
93   VERIFY( grcv );
94   VERIFY( grcv(&x) == 4 );
95   VERIFY( typeid(int (X::*)() const volatile) == grcv.target_type() );
96   VERIFY( *grcv.target<int (X::*)() const volatile >() == &X::foo_cv );
97   VERIFY( grcv.target<int (X::*)() const>() == 0 );
98 }
99 
main()100 int main()
101 {
102   test05();
103   return 0;
104 }
105