Chris@16
|
1 // (C) Copyright Gennadiy Rozental 2005-2008.
|
Chris@16
|
2 // Use, modification, and distribution are subject to the
|
Chris@16
|
3 // Boost Software License, Version 1.0. (See accompanying file
|
Chris@16
|
4 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
5
|
Chris@16
|
6 // See http://www.boost.org/libs/test for the library home page.
|
Chris@16
|
7 //
|
Chris@16
|
8 // File : $RCSfile$
|
Chris@16
|
9 //
|
Chris@101
|
10 // Version : $Revision$
|
Chris@16
|
11 //
|
Chris@16
|
12 // Description :
|
Chris@16
|
13 // ***************************************************************************
|
Chris@16
|
14
|
Chris@16
|
15 #ifndef BOOST_TEST_CALLBACK_020505GER
|
Chris@16
|
16 #define BOOST_TEST_CALLBACK_020505GER
|
Chris@16
|
17
|
Chris@16
|
18 // Boost
|
Chris@16
|
19 #include <boost/config.hpp>
|
Chris@16
|
20 #include <boost/detail/workaround.hpp>
|
Chris@16
|
21 #include <boost/shared_ptr.hpp>
|
Chris@16
|
22
|
Chris@16
|
23 #include <boost/test/detail/suppress_warnings.hpp>
|
Chris@16
|
24
|
Chris@16
|
25 #if BOOST_WORKAROUND(BOOST_MSVC, < 1300) || BOOST_WORKAROUND(BOOST_INTEL, <= 700)
|
Chris@16
|
26 # define BOOST_CALLBACK_EXPLICIT_COPY_CONSTRUCTOR
|
Chris@16
|
27 #endif
|
Chris@16
|
28
|
Chris@16
|
29 //____________________________________________________________________________//
|
Chris@16
|
30
|
Chris@16
|
31 namespace boost {
|
Chris@16
|
32
|
Chris@16
|
33 namespace unit_test {
|
Chris@16
|
34
|
Chris@16
|
35 namespace ut_detail {
|
Chris@16
|
36
|
Chris@16
|
37 struct unused {};
|
Chris@16
|
38
|
Chris@16
|
39 template<typename R>
|
Chris@16
|
40 struct invoker {
|
Chris@16
|
41 template<typename Functor>
|
Chris@16
|
42 R invoke( Functor& f ) { return f(); }
|
Chris@16
|
43 template<typename Functor, typename T1>
|
Chris@16
|
44 R invoke( Functor& f, T1 t1 ) { return f( t1 ); }
|
Chris@16
|
45 template<typename Functor, typename T1, typename T2>
|
Chris@16
|
46 R invoke( Functor& f, T1 t1, T2 t2 ) { return f( t1, t2 ); }
|
Chris@16
|
47 template<typename Functor, typename T1, typename T2, typename T3>
|
Chris@16
|
48 R invoke( Functor& f, T1 t1, T2 t2, T3 t3 ) { return f( t1, t2, t3 ); }
|
Chris@16
|
49 };
|
Chris@16
|
50
|
Chris@16
|
51 //____________________________________________________________________________//
|
Chris@16
|
52
|
Chris@16
|
53 template<>
|
Chris@16
|
54 struct invoker<unused> {
|
Chris@16
|
55 template<typename Functor>
|
Chris@16
|
56 unused invoke( Functor& f ) { f(); return unused(); }
|
Chris@16
|
57 template<typename Functor, typename T1>
|
Chris@16
|
58 unused invoke( Functor& f, T1 t1 ) { f( t1 ); return unused(); }
|
Chris@16
|
59 template<typename Functor, typename T1, typename T2>
|
Chris@16
|
60 unused invoke( Functor& f, T1 t1, T2 t2 ) { f( t1, t2 ); return unused(); }
|
Chris@16
|
61 template<typename Functor, typename T1, typename T2, typename T3>
|
Chris@16
|
62 unused invoke( Functor& f, T1 t1, T2 t2, T3 t3 ) { f( t1, t2, t3 ); return unused(); }
|
Chris@16
|
63 };
|
Chris@16
|
64
|
Chris@16
|
65 //____________________________________________________________________________//
|
Chris@16
|
66
|
Chris@16
|
67 } // namespace ut_detail
|
Chris@16
|
68
|
Chris@16
|
69 // ************************************************************************** //
|
Chris@16
|
70 // ************** unit_test::callback0 ************** //
|
Chris@16
|
71 // ************************************************************************** //
|
Chris@16
|
72
|
Chris@16
|
73 namespace ut_detail {
|
Chris@16
|
74
|
Chris@16
|
75 template<typename R>
|
Chris@16
|
76 struct callback0_impl {
|
Chris@16
|
77 virtual ~callback0_impl() {}
|
Chris@16
|
78
|
Chris@16
|
79 virtual R invoke() = 0;
|
Chris@16
|
80 };
|
Chris@16
|
81
|
Chris@16
|
82 //____________________________________________________________________________//
|
Chris@16
|
83
|
Chris@16
|
84 template<typename R, typename Functor>
|
Chris@16
|
85 struct callback0_impl_t : callback0_impl<R> {
|
Chris@16
|
86 // Constructor
|
Chris@16
|
87 explicit callback0_impl_t( Functor f ) : m_f( f ) {}
|
Chris@16
|
88
|
Chris@16
|
89 virtual R invoke() { return invoker<R>().invoke( m_f ); }
|
Chris@16
|
90
|
Chris@16
|
91 private:
|
Chris@16
|
92 // Data members
|
Chris@16
|
93 Functor m_f;
|
Chris@16
|
94 };
|
Chris@16
|
95
|
Chris@16
|
96 //____________________________________________________________________________//
|
Chris@16
|
97
|
Chris@16
|
98 } // namespace ut_detail
|
Chris@16
|
99
|
Chris@16
|
100 template<typename R = ut_detail::unused>
|
Chris@16
|
101 class callback0 {
|
Chris@16
|
102 public:
|
Chris@16
|
103 // Constructors
|
Chris@16
|
104 callback0() {}
|
Chris@16
|
105 #ifdef BOOST_CALLBACK_EXPLICIT_COPY_CONSTRUCTOR
|
Chris@16
|
106 callback0( callback0 const& rhs ) : m_impl( rhs.m_impl ) {}
|
Chris@16
|
107 #endif
|
Chris@16
|
108
|
Chris@16
|
109 template<typename Functor>
|
Chris@16
|
110 callback0( Functor f )
|
Chris@16
|
111 : m_impl( new ut_detail::callback0_impl_t<R,Functor>( f ) ) {}
|
Chris@16
|
112
|
Chris@16
|
113 void operator=( callback0 const& rhs ) { m_impl = rhs.m_impl; }
|
Chris@16
|
114
|
Chris@16
|
115 template<typename Functor>
|
Chris@16
|
116 void operator=( Functor f ) { m_impl.reset( new ut_detail::callback0_impl_t<R,Functor>( f ) ); }
|
Chris@16
|
117
|
Chris@16
|
118 R operator()() const { return m_impl->invoke(); }
|
Chris@16
|
119
|
Chris@16
|
120 bool operator!() const { return !m_impl; }
|
Chris@16
|
121
|
Chris@16
|
122 private:
|
Chris@16
|
123 // Data members
|
Chris@16
|
124 boost::shared_ptr<ut_detail::callback0_impl<R> > m_impl;
|
Chris@16
|
125 };
|
Chris@16
|
126
|
Chris@16
|
127 // ************************************************************************** //
|
Chris@16
|
128 // ************** unit_test::callback1 ************** //
|
Chris@16
|
129 // ************************************************************************** //
|
Chris@16
|
130
|
Chris@16
|
131 namespace ut_detail {
|
Chris@16
|
132
|
Chris@16
|
133 template<typename R, typename T1>
|
Chris@16
|
134 struct callback1_impl {
|
Chris@16
|
135 virtual ~callback1_impl() {}
|
Chris@16
|
136
|
Chris@16
|
137 virtual R invoke( T1 t1 ) = 0;
|
Chris@16
|
138 };
|
Chris@16
|
139
|
Chris@16
|
140 //____________________________________________________________________________//
|
Chris@16
|
141
|
Chris@16
|
142 template<typename R, typename T1,typename Functor>
|
Chris@16
|
143 struct callback1_impl_t : callback1_impl<R,T1> {
|
Chris@16
|
144 // Constructor
|
Chris@16
|
145 explicit callback1_impl_t( Functor f ) : m_f( f ) {}
|
Chris@16
|
146
|
Chris@16
|
147 virtual R invoke( T1 t1 ) { return invoker<R>().invoke( m_f, t1 ); }
|
Chris@16
|
148
|
Chris@16
|
149 private:
|
Chris@16
|
150 // Data members
|
Chris@16
|
151 Functor m_f;
|
Chris@16
|
152 };
|
Chris@16
|
153
|
Chris@16
|
154 //____________________________________________________________________________//
|
Chris@16
|
155
|
Chris@16
|
156 } // namespace ut_detail
|
Chris@16
|
157
|
Chris@16
|
158 template<typename T1,typename R = ut_detail::unused>
|
Chris@16
|
159 class callback1 {
|
Chris@16
|
160 public:
|
Chris@16
|
161 // Constructors
|
Chris@16
|
162 callback1() {}
|
Chris@16
|
163 #ifdef BOOST_CALLBACK_EXPLICIT_COPY_CONSTRUCTOR
|
Chris@16
|
164 callback1( callback1 const& rhs ) : m_impl( rhs.m_impl ) {}
|
Chris@16
|
165 #endif
|
Chris@16
|
166
|
Chris@16
|
167 template<typename Functor>
|
Chris@16
|
168 callback1( Functor f )
|
Chris@16
|
169 : m_impl( new ut_detail::callback1_impl_t<R,T1,Functor>( f ) ) {}
|
Chris@16
|
170
|
Chris@16
|
171 void operator=( callback1 const& rhs ) { m_impl = rhs.m_impl; }
|
Chris@16
|
172
|
Chris@16
|
173 template<typename Functor>
|
Chris@16
|
174 void operator=( Functor f ) { m_impl.reset( new ut_detail::callback1_impl_t<R,T1,Functor>( f ) ); }
|
Chris@16
|
175
|
Chris@16
|
176 R operator()( T1 t1 ) const { return m_impl->invoke( t1 ); }
|
Chris@16
|
177
|
Chris@16
|
178 bool operator!() const { return !m_impl; }
|
Chris@16
|
179
|
Chris@16
|
180 private:
|
Chris@16
|
181 // Data members
|
Chris@16
|
182 boost::shared_ptr<ut_detail::callback1_impl<R,T1> > m_impl;
|
Chris@16
|
183 };
|
Chris@16
|
184
|
Chris@16
|
185 // ************************************************************************** //
|
Chris@16
|
186 // ************** unit_test::callback2 ************** //
|
Chris@16
|
187 // ************************************************************************** //
|
Chris@16
|
188
|
Chris@16
|
189 namespace ut_detail {
|
Chris@16
|
190
|
Chris@16
|
191 template<typename R, typename T1,typename T2>
|
Chris@16
|
192 struct callback2_impl {
|
Chris@16
|
193 virtual ~callback2_impl() {}
|
Chris@16
|
194
|
Chris@16
|
195 virtual R invoke( T1 t1, T2 t2 ) = 0;
|
Chris@16
|
196 };
|
Chris@16
|
197
|
Chris@16
|
198 //____________________________________________________________________________//
|
Chris@16
|
199
|
Chris@16
|
200 template<typename R, typename T1, typename T2, typename Functor>
|
Chris@16
|
201 struct callback2_impl_t : callback2_impl<R,T1,T2> {
|
Chris@16
|
202 // Constructor
|
Chris@16
|
203 explicit callback2_impl_t( Functor f ) : m_f( f ) {}
|
Chris@16
|
204
|
Chris@16
|
205 virtual R invoke( T1 t1, T2 t2 ) { return invoker<R>().template invoke<Functor,T1,T2>( m_f, t1, t2 ); }
|
Chris@16
|
206
|
Chris@16
|
207 private:
|
Chris@16
|
208 // Data members
|
Chris@16
|
209 Functor m_f;
|
Chris@16
|
210 };
|
Chris@16
|
211
|
Chris@16
|
212 //____________________________________________________________________________//
|
Chris@16
|
213
|
Chris@16
|
214 } // namespace ut_detail
|
Chris@16
|
215
|
Chris@16
|
216 template<typename T1,typename T2, typename R = ut_detail::unused>
|
Chris@16
|
217 class callback2 {
|
Chris@16
|
218 public:
|
Chris@16
|
219 // Constructors
|
Chris@16
|
220 callback2() {}
|
Chris@16
|
221 #ifdef BOOST_CALLBACK_EXPLICIT_COPY_CONSTRUCTOR
|
Chris@16
|
222 callback2( callback2 const& rhs ) : m_impl( rhs.m_impl ) {}
|
Chris@16
|
223 #endif
|
Chris@16
|
224
|
Chris@16
|
225 template<typename Functor>
|
Chris@16
|
226 callback2( Functor f ) : m_impl( new ut_detail::callback2_impl_t<R,T1,T2,Functor>( f ) ) {}
|
Chris@16
|
227
|
Chris@16
|
228 void operator=( callback2 const& rhs ) { m_impl = rhs.m_impl; }
|
Chris@16
|
229
|
Chris@16
|
230 template<typename Functor>
|
Chris@16
|
231 void operator=( Functor f ) { m_impl.reset( new ut_detail::callback2_impl_t<R,T1,T2,Functor>( f ) ); }
|
Chris@16
|
232
|
Chris@16
|
233 R operator()( T1 t1, T2 t2 ) const { return m_impl->invoke( t1, t2 ); }
|
Chris@16
|
234
|
Chris@16
|
235 bool operator!() const { return !m_impl; }
|
Chris@16
|
236
|
Chris@16
|
237 private:
|
Chris@16
|
238 // Data members
|
Chris@16
|
239 boost::shared_ptr<ut_detail::callback2_impl<R,T1,T2> > m_impl;
|
Chris@16
|
240 };
|
Chris@16
|
241
|
Chris@16
|
242 // ************************************************************************** //
|
Chris@16
|
243 // ************** unit_test::callback3 ************** //
|
Chris@16
|
244 // ************************************************************************** //
|
Chris@16
|
245
|
Chris@16
|
246 namespace ut_detail {
|
Chris@16
|
247
|
Chris@16
|
248 template<typename R, typename T1, typename T2, typename T3>
|
Chris@16
|
249 struct callback3_impl {
|
Chris@16
|
250 virtual ~callback3_impl() {}
|
Chris@16
|
251
|
Chris@16
|
252 virtual R invoke( T1 t1, T2 t2, T3 t3 ) = 0;
|
Chris@16
|
253 };
|
Chris@16
|
254
|
Chris@16
|
255 //____________________________________________________________________________//
|
Chris@16
|
256
|
Chris@16
|
257 template<typename R, typename T1, typename T2, typename T3, typename Functor>
|
Chris@16
|
258 struct callback3_impl_t : callback3_impl<R,T1,T2,T3> {
|
Chris@16
|
259 // Constructor
|
Chris@16
|
260 explicit callback3_impl_t( Functor f ) : m_f( f ) {}
|
Chris@16
|
261
|
Chris@16
|
262 virtual R invoke( T1 t1, T2 t2, T3 t3 ) { return invoker<R>().invoke( m_f, t1, t2, t3 ); }
|
Chris@16
|
263
|
Chris@16
|
264 private:
|
Chris@16
|
265 // Data members
|
Chris@16
|
266 Functor m_f;
|
Chris@16
|
267 };
|
Chris@16
|
268
|
Chris@16
|
269 //____________________________________________________________________________//
|
Chris@16
|
270
|
Chris@16
|
271 } // namespace ut_detail
|
Chris@16
|
272
|
Chris@16
|
273 template<typename T1,typename T2, typename T3, typename R = ut_detail::unused>
|
Chris@16
|
274 class callback3 {
|
Chris@16
|
275 public:
|
Chris@16
|
276 // Constructors
|
Chris@16
|
277 callback3() {}
|
Chris@16
|
278 #ifdef BOOST_CALLBACK_EXPLICIT_COPY_CONSTRUCTOR
|
Chris@16
|
279 callback3( callback3 const& rhs ) : m_impl( rhs.m_impl ) {}
|
Chris@16
|
280 #endif
|
Chris@16
|
281
|
Chris@16
|
282 template<typename Functor>
|
Chris@16
|
283 callback3( Functor f )
|
Chris@16
|
284 : m_impl( new ut_detail::callback3_impl_t<R,T1,T2,T3,Functor>( f ) ) {}
|
Chris@16
|
285
|
Chris@16
|
286 void operator=( callback3 const& rhs ) { m_impl = rhs.m_impl; }
|
Chris@16
|
287
|
Chris@16
|
288 template<typename Functor>
|
Chris@16
|
289 void operator=( Functor f ) { m_impl.reset( new ut_detail::callback3_impl_t<R,T1,T2,T3,Functor>( f ) ); }
|
Chris@16
|
290
|
Chris@16
|
291 R operator()( T1 t1, T2 t2, T3 t3 ) const { return m_impl->invoke( t1, t2, t3 ); }
|
Chris@16
|
292
|
Chris@16
|
293 bool operator!() const { return !m_impl; }
|
Chris@16
|
294
|
Chris@16
|
295 private:
|
Chris@16
|
296 // Data members
|
Chris@16
|
297 boost::shared_ptr<ut_detail::callback3_impl<R,T1,T2,T3> > m_impl;
|
Chris@16
|
298 };
|
Chris@16
|
299
|
Chris@16
|
300 } // namespace unit_test
|
Chris@16
|
301
|
Chris@16
|
302 } // namespace boost
|
Chris@16
|
303
|
Chris@16
|
304 #undef BOOST_CALLBACK_EXPLICIT_COPY_CONSTRUCTOR
|
Chris@16
|
305
|
Chris@16
|
306 //____________________________________________________________________________//
|
Chris@16
|
307
|
Chris@16
|
308 #include <boost/test/detail/enable_warnings.hpp>
|
Chris@16
|
309
|
Chris@16
|
310 #endif // BOOST_TEST_CALLBACK_020505GER
|