1// 2005-02-27 Douglas Gregor <doug.gregor -at- gmail.com>
2//
3// Copyright (C) 2005 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 2, 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 COPYING.  If not, write to the Free
18// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
19// USA.
20
21// 2.1 reference wrappers
22#include <tr1/functional>
23#include <tr1/type_traits>
24#include <testsuite_hooks.h>
25#include <testsuite_tr1.h>
26
27using namespace __gnu_test;
28
29bool test __attribute__((unused)) = true;
30
31struct X
32{
33  typedef int result_type;
34
35  X() : bar(17) {}
36
37  int foo(float x)                   { return truncate_float(x); }
38  int foo_c(float x)  const          { return truncate_float(x); }
39  int foo_v(float x)  volatile       { return truncate_float(x); }
40  int foo_cv(float x) const volatile { return truncate_float(x); }
41
42  int operator()(float x)
43  {
44    return foo(x) + 1;
45  }
46
47  int operator()(float x) const
48  {
49    return foo_c(x) + 2;
50  }
51
52  int bar;
53
54 private:
55  X(const X&);
56  X& operator=(const X&);
57};
58
59int seventeen() { return 17; }
60
61struct get_seventeen
62{
63  typedef int result_type;
64  int operator()() const { return 17; }
65};
66
67void test01()
68{
69  using std::tr1::ref;
70  using std::tr1::cref;
71
72  ::get_seventeen get_sev;
73  ::X x;
74  ::X* xp = &x;
75  int (::X::* p_foo)(float) = &::X::foo;
76  int (::X::* p_foo_c)(float) const = &::X::foo_c;
77  int (::X::* p_foo_v)(float) volatile = &::X::foo_v;
78  int (::X::* p_foo_cv)(float) const volatile = &::X::foo_cv;
79  int ::X::* p_bar = &::X::bar;
80
81  const float pi = 3.14;
82
83  // Functions
84  VERIFY(ref(truncate_float)(pi) == 3);
85  VERIFY(ref(seventeen)() == 17);
86
87  // Function pointers
88  VERIFY(cref(&truncate_float)(pi) == 3);
89  VERIFY(cref(&seventeen)() == 17);
90
91  // Member function pointers
92  VERIFY(ref(p_foo)(x, pi) == 3);
93  VERIFY(ref(p_foo)(xp, pi) == 3);
94  VERIFY(ref(p_foo_c)(x, pi) == 3);
95  VERIFY(ref(p_foo_c)(xp, pi) == 3);
96  VERIFY(ref(p_foo_v)(x, pi) == 3);
97  VERIFY(ref(p_foo_v)(xp, pi) == 3);
98  VERIFY(ref(p_foo_cv)(x, pi) == 3);
99  VERIFY(ref(p_foo_cv)(xp, pi) == 3);
100
101  // Member data pointers
102  VERIFY(ref(p_bar)(x) == 17);
103  VERIFY(ref(p_bar)(xp) == 17);
104
105  // Function objects
106  VERIFY(ref(get_sev)() == 17);
107  VERIFY(cref(get_sev)() == 17);
108  VERIFY(ref(x)(pi) == 4);
109  VERIFY(cref(x)(pi) == 5);
110}
111
112int main()
113{
114  test01();
115  return 0;
116}
117