comparison DEPENDENCIES/generic/include/boost/test/utils/callback.hpp @ 16:2665513ce2d3

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