1 // Boost.Function library
3 // Copyright Douglas Gregor 2004. Use, modification and
4 // distribution is subject to the Boost Software License, Version
5 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt)
8 #include <boost/test/minimal.hpp>
9 #include <boost/function.hpp>
10 #include <boost/ref.hpp>
12 static int forty_two() { return 42; }
16 int operator()() const { return 17; }
21 explicit ReturnInt(int value
) : value(value
) {}
23 int operator()() const { return value
; }
28 bool operator==(const ReturnInt
& x
, const ReturnInt
& y
)
29 { return x
.value
== y
.value
; }
31 bool operator!=(const ReturnInt
& x
, const ReturnInt
& y
)
32 { return x
.value
!= y
.value
; }
34 namespace contain_test
{
38 explicit ReturnIntFE(int value
) : value(value
) {}
40 int operator()() const { return value
; }
47 #ifndef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
49 namespace contain_test
{
50 # ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
51 bool function_equal(const ReturnIntFE
& x
, const ReturnIntFE
& y
)
52 { return x
.value
== y
.value
; }
54 bool function_equal_impl(const ReturnIntFE
& x
, const ReturnIntFE
& y
, int)
55 { return x
.value
== y
.value
; }
56 # endif // #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
58 #else // BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
60 # ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
62 function_equal(const contain_test::ReturnIntFE
& x
,
63 const contain_test::ReturnIntFE
& y
)
64 { return x
.value
== y
.value
; }
67 function_equal_impl(const contain_test::ReturnIntFE
& x
,
68 const contain_test::ReturnIntFE
& y
, int)
69 { return x
.value
== y
.value
; }
74 static void target_test()
76 boost::function0
<int> f
;
79 BOOST_CHECK(*f
.target
<int (*)()>() == &forty_two
);
80 BOOST_CHECK(!f
.target
<Seventeen
>());
83 BOOST_CHECK(!f
.target
<int (*)()>());
84 BOOST_CHECK(f
.target
<Seventeen
>());
86 Seventeen this_seventeen
;
87 f
= boost::ref(this_seventeen
);
88 BOOST_CHECK(!f
.target
<int (*)()>());
89 BOOST_CHECK(f
.target
<Seventeen
>());
90 BOOST_CHECK(f
.target
<Seventeen
>() == &this_seventeen
);
92 const Seventeen const_seventeen
= this_seventeen
;
93 f
= boost::ref(const_seventeen
);
94 BOOST_CHECK(!f
.target
<int (*)()>());
95 BOOST_CHECK(f
.target
<const Seventeen
>());
96 BOOST_CHECK(f
.target
<const Seventeen
>() == &const_seventeen
);
97 BOOST_CHECK(f
.target
<const volatile Seventeen
>());
98 BOOST_CHECK(!f
.target
<Seventeen
>());
99 BOOST_CHECK(!f
.target
<volatile Seventeen
>());
102 static void equal_test()
104 boost::function0
<int> f
;
107 BOOST_CHECK(f
== &forty_two
);
108 BOOST_CHECK(f
!= ReturnInt(17));
109 #if !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3)
110 BOOST_CHECK(&forty_two
== f
);
111 BOOST_CHECK(ReturnInt(17) != f
);
114 BOOST_CHECK(f
.contains(&forty_two
));
117 BOOST_CHECK(f
!= &forty_two
);
118 BOOST_CHECK(f
== ReturnInt(17));
119 BOOST_CHECK(f
!= ReturnInt(16));
120 #if !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3)
121 BOOST_CHECK(&forty_two
!= f
);
122 BOOST_CHECK(ReturnInt(17) == f
);
123 BOOST_CHECK(ReturnInt(16) != f
);
126 BOOST_CHECK(f
.contains(ReturnInt(17)));
128 f
= contain_test::ReturnIntFE(17);
129 BOOST_CHECK(f
!= &forty_two
);
130 BOOST_CHECK(f
== contain_test::ReturnIntFE(17));
131 BOOST_CHECK(f
!= contain_test::ReturnIntFE(16));
132 #if !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3)
133 BOOST_CHECK(&forty_two
!= f
);
134 BOOST_CHECK(contain_test::ReturnIntFE(17) == f
);
135 BOOST_CHECK(contain_test::ReturnIntFE(16) != f
);
138 BOOST_CHECK(f
.contains(contain_test::ReturnIntFE(17)));
140 #if !defined(BOOST_FUNCTION_NO_FUNCTION_TYPE_SYNTAX)
141 boost::function
<int(void)> g
;
144 BOOST_CHECK(g
== &forty_two
);
145 BOOST_CHECK(g
!= ReturnInt(17));
146 # if !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3)
147 BOOST_CHECK(&forty_two
== g
);
148 BOOST_CHECK(ReturnInt(17) != g
);
152 BOOST_CHECK(g
!= &forty_two
);
153 BOOST_CHECK(g
== ReturnInt(17));
154 BOOST_CHECK(g
!= ReturnInt(16));
155 # if !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3)
156 BOOST_CHECK(&forty_two
!= g
);
157 BOOST_CHECK(ReturnInt(17) == g
);
158 BOOST_CHECK(ReturnInt(16) != g
);
163 static void ref_equal_test()
167 boost::function0
<int> f
= boost::ref(ri
);
169 // References and values are equal
170 BOOST_CHECK(f
== boost::ref(ri
));
171 BOOST_CHECK(f
== ri
);
172 BOOST_CHECK(boost::ref(ri
) == f
);
173 BOOST_CHECK(!(f
!= boost::ref(ri
)));
174 BOOST_CHECK(!(f
!= ri
));
175 BOOST_CHECK(!(boost::ref(ri
) != f
));
176 #if !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3)
177 BOOST_CHECK(ri
== f
);
178 BOOST_CHECK(!(ri
!= f
));
181 // Values equal, references inequal
183 BOOST_CHECK(f
== ri2
);
184 BOOST_CHECK(f
!= boost::ref(ri2
));
185 BOOST_CHECK(boost::ref(ri2
) != f
);
186 BOOST_CHECK(!(f
!= ri2
));
187 BOOST_CHECK(!(f
== boost::ref(ri2
)));
188 BOOST_CHECK(!(boost::ref(ri2
) == f
));
189 #if !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3)
190 BOOST_CHECK(ri2
== f
);
191 BOOST_CHECK(!(ri2
!= f
));
195 #if !defined(BOOST_FUNCTION_NO_FUNCTION_TYPE_SYNTAX)
198 boost::function
<int(void)> f
= boost::ref(ri
);
200 // References and values are equal
201 BOOST_CHECK(f
== boost::ref(ri
));
202 BOOST_CHECK(f
== ri
);
203 BOOST_CHECK(boost::ref(ri
) == f
);
204 BOOST_CHECK(!(f
!= boost::ref(ri
)));
205 BOOST_CHECK(!(f
!= ri
));
206 BOOST_CHECK(!(boost::ref(ri
) != f
));
207 # if !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3)
208 BOOST_CHECK(ri
== f
);
209 BOOST_CHECK(!(ri
!= f
));
212 // Values equal, references inequal
214 BOOST_CHECK(f
== ri2
);
215 BOOST_CHECK(f
!= boost::ref(ri2
));
216 BOOST_CHECK(boost::ref(ri2
) != f
);
217 BOOST_CHECK(!(f
!= ri2
));
218 BOOST_CHECK(!(f
== boost::ref(ri2
)));
219 BOOST_CHECK(!(boost::ref(ri2
) == f
));
220 # if !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3)
221 BOOST_CHECK(ri2
== f
);
222 BOOST_CHECK(!(ri2
!= f
));
228 int test_main(int, char*[])