1 #ifndef BOOST_BIND_STORAGE_HPP_INCLUDED
\r
2 #define BOOST_BIND_STORAGE_HPP_INCLUDED
\r
4 // MS compatible compilers support #pragma once
\r
6 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
\r
13 // boost/bind.hpp support header, optimized storage
\r
15 // Copyright (c) 2006 Peter Dimov
\r
17 // Distributed under the Boost Software License, Version 1.0.
\r
18 // See accompanying file LICENSE_1_0.txt or copy at
\r
19 // http://www.boost.org/LICENSE_1_0.txt
\r
21 // See http://www.boost.org/libs/bind/bind.html for documentation.
\r
24 #include <boost/config.hpp>
\r
25 #include <boost/bind/arg.hpp>
\r
28 # pragma warning(push)
\r
29 # pragma warning(disable: 4512) // assignment operator could not be generated
\r
40 template<class A1> struct storage1
\r
42 explicit storage1( A1 a1 ): a1_( a1 ) {}
\r
44 template<class V> void accept(V & v) const
\r
46 BOOST_BIND_VISIT_EACH(v, a1_, 0);
\r
52 #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION ) && !defined( __BORLANDC__ )
\r
54 template<int I> struct storage1< boost::arg<I> >
\r
56 explicit storage1( boost::arg<I> ) {}
\r
58 template<class V> void accept(V &) const { }
\r
60 static boost::arg<I> a1_() { return boost::arg<I>(); }
\r
63 template<int I> struct storage1< boost::arg<I> (*) () >
\r
65 explicit storage1( boost::arg<I> (*) () ) {}
\r
67 template<class V> void accept(V &) const { }
\r
69 static boost::arg<I> a1_() { return boost::arg<I>(); }
\r
76 template<class A1, class A2> struct storage2: public storage1<A1>
\r
78 typedef storage1<A1> inherited;
\r
80 storage2( A1 a1, A2 a2 ): storage1<A1>( a1 ), a2_( a2 ) {}
\r
82 template<class V> void accept(V & v) const
\r
84 inherited::accept(v);
\r
85 BOOST_BIND_VISIT_EACH(v, a2_, 0);
\r
91 #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
\r
93 template<class A1, int I> struct storage2< A1, boost::arg<I> >: public storage1<A1>
\r
95 typedef storage1<A1> inherited;
\r
97 storage2( A1 a1, boost::arg<I> ): storage1<A1>( a1 ) {}
\r
99 template<class V> void accept(V & v) const
\r
101 inherited::accept(v);
\r
104 static boost::arg<I> a2_() { return boost::arg<I>(); }
\r
107 template<class A1, int I> struct storage2< A1, boost::arg<I> (*) () >: public storage1<A1>
\r
109 typedef storage1<A1> inherited;
\r
111 storage2( A1 a1, boost::arg<I> (*) () ): storage1<A1>( a1 ) {}
\r
113 template<class V> void accept(V & v) const
\r
115 inherited::accept(v);
\r
118 static boost::arg<I> a2_() { return boost::arg<I>(); }
\r
125 template<class A1, class A2, class A3> struct storage3: public storage2< A1, A2 >
\r
127 typedef storage2<A1, A2> inherited;
\r
129 storage3( A1 a1, A2 a2, A3 a3 ): storage2<A1, A2>( a1, a2 ), a3_( a3 ) {}
\r
131 template<class V> void accept(V & v) const
\r
133 inherited::accept(v);
\r
134 BOOST_BIND_VISIT_EACH(v, a3_, 0);
\r
140 #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
\r
142 template<class A1, class A2, int I> struct storage3< A1, A2, boost::arg<I> >: public storage2< A1, A2 >
\r
144 typedef storage2<A1, A2> inherited;
\r
146 storage3( A1 a1, A2 a2, boost::arg<I> ): storage2<A1, A2>( a1, a2 ) {}
\r
148 template<class V> void accept(V & v) const
\r
150 inherited::accept(v);
\r
153 static boost::arg<I> a3_() { return boost::arg<I>(); }
\r
156 template<class A1, class A2, int I> struct storage3< A1, A2, boost::arg<I> (*) () >: public storage2< A1, A2 >
\r
158 typedef storage2<A1, A2> inherited;
\r
160 storage3( A1 a1, A2 a2, boost::arg<I> (*) () ): storage2<A1, A2>( a1, a2 ) {}
\r
162 template<class V> void accept(V & v) const
\r
164 inherited::accept(v);
\r
167 static boost::arg<I> a3_() { return boost::arg<I>(); }
\r
174 template<class A1, class A2, class A3, class A4> struct storage4: public storage3< A1, A2, A3 >
\r
176 typedef storage3<A1, A2, A3> inherited;
\r
178 storage4( A1 a1, A2 a2, A3 a3, A4 a4 ): storage3<A1, A2, A3>( a1, a2, a3 ), a4_( a4 ) {}
\r
180 template<class V> void accept(V & v) const
\r
182 inherited::accept(v);
\r
183 BOOST_BIND_VISIT_EACH(v, a4_, 0);
\r
189 #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
\r
191 template<class A1, class A2, class A3, int I> struct storage4< A1, A2, A3, boost::arg<I> >: public storage3< A1, A2, A3 >
\r
193 typedef storage3<A1, A2, A3> inherited;
\r
195 storage4( A1 a1, A2 a2, A3 a3, boost::arg<I> ): storage3<A1, A2, A3>( a1, a2, a3 ) {}
\r
197 template<class V> void accept(V & v) const
\r
199 inherited::accept(v);
\r
202 static boost::arg<I> a4_() { return boost::arg<I>(); }
\r
205 template<class A1, class A2, class A3, int I> struct storage4< A1, A2, A3, boost::arg<I> (*) () >: public storage3< A1, A2, A3 >
\r
207 typedef storage3<A1, A2, A3> inherited;
\r
209 storage4( A1 a1, A2 a2, A3 a3, boost::arg<I> (*) () ): storage3<A1, A2, A3>( a1, a2, a3 ) {}
\r
211 template<class V> void accept(V & v) const
\r
213 inherited::accept(v);
\r
216 static boost::arg<I> a4_() { return boost::arg<I>(); }
\r
223 template<class A1, class A2, class A3, class A4, class A5> struct storage5: public storage4< A1, A2, A3, A4 >
\r
225 typedef storage4<A1, A2, A3, A4> inherited;
\r
227 storage5( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ): storage4<A1, A2, A3, A4>( a1, a2, a3, a4 ), a5_( a5 ) {}
\r
229 template<class V> void accept(V & v) const
\r
231 inherited::accept(v);
\r
232 BOOST_BIND_VISIT_EACH(v, a5_, 0);
\r
238 #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
\r
240 template<class A1, class A2, class A3, class A4, int I> struct storage5< A1, A2, A3, A4, boost::arg<I> >: public storage4< A1, A2, A3, A4 >
\r
242 typedef storage4<A1, A2, A3, A4> inherited;
\r
244 storage5( A1 a1, A2 a2, A3 a3, A4 a4, boost::arg<I> ): storage4<A1, A2, A3, A4>( a1, a2, a3, a4 ) {}
\r
246 template<class V> void accept(V & v) const
\r
248 inherited::accept(v);
\r
251 static boost::arg<I> a5_() { return boost::arg<I>(); }
\r
254 template<class A1, class A2, class A3, class A4, int I> struct storage5< A1, A2, A3, A4, boost::arg<I> (*) () >: public storage4< A1, A2, A3, A4 >
\r
256 typedef storage4<A1, A2, A3, A4> inherited;
\r
258 storage5( A1 a1, A2 a2, A3 a3, A4 a4, boost::arg<I> (*) () ): storage4<A1, A2, A3, A4>( a1, a2, a3, a4 ) {}
\r
260 template<class V> void accept(V & v) const
\r
262 inherited::accept(v);
\r
265 static boost::arg<I> a5_() { return boost::arg<I>(); }
\r
272 template<class A1, class A2, class A3, class A4, class A5, class A6> struct storage6: public storage5< A1, A2, A3, A4, A5 >
\r
274 typedef storage5<A1, A2, A3, A4, A5> inherited;
\r
276 storage6( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6 ): storage5<A1, A2, A3, A4, A5>( a1, a2, a3, a4, a5 ), a6_( a6 ) {}
\r
278 template<class V> void accept(V & v) const
\r
280 inherited::accept(v);
\r
281 BOOST_BIND_VISIT_EACH(v, a6_, 0);
\r
287 #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
\r
289 template<class A1, class A2, class A3, class A4, class A5, int I> struct storage6< A1, A2, A3, A4, A5, boost::arg<I> >: public storage5< A1, A2, A3, A4, A5 >
\r
291 typedef storage5<A1, A2, A3, A4, A5> inherited;
\r
293 storage6( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, boost::arg<I> ): storage5<A1, A2, A3, A4, A5>( a1, a2, a3, a4, a5 ) {}
\r
295 template<class V> void accept(V & v) const
\r
297 inherited::accept(v);
\r
300 static boost::arg<I> a6_() { return boost::arg<I>(); }
\r
303 template<class A1, class A2, class A3, class A4, class A5, int I> struct storage6< A1, A2, A3, A4, A5, boost::arg<I> (*) () >: public storage5< A1, A2, A3, A4, A5 >
\r
305 typedef storage5<A1, A2, A3, A4, A5> inherited;
\r
307 storage6( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, boost::arg<I> (*) () ): storage5<A1, A2, A3, A4, A5>( a1, a2, a3, a4, a5 ) {}
\r
309 template<class V> void accept(V & v) const
\r
311 inherited::accept(v);
\r
314 static boost::arg<I> a6_() { return boost::arg<I>(); }
\r
321 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> struct storage7: public storage6< A1, A2, A3, A4, A5, A6 >
\r
323 typedef storage6<A1, A2, A3, A4, A5, A6> inherited;
\r
325 storage7( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7 ): storage6<A1, A2, A3, A4, A5, A6>( a1, a2, a3, a4, a5, a6 ), a7_( a7 ) {}
\r
327 template<class V> void accept(V & v) const
\r
329 inherited::accept(v);
\r
330 BOOST_BIND_VISIT_EACH(v, a7_, 0);
\r
336 #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
\r
338 template<class A1, class A2, class A3, class A4, class A5, class A6, int I> struct storage7< A1, A2, A3, A4, A5, A6, boost::arg<I> >: public storage6< A1, A2, A3, A4, A5, A6 >
\r
340 typedef storage6<A1, A2, A3, A4, A5, A6> inherited;
\r
342 storage7( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, boost::arg<I> ): storage6<A1, A2, A3, A4, A5, A6>( a1, a2, a3, a4, a5, a6 ) {}
\r
344 template<class V> void accept(V & v) const
\r
346 inherited::accept(v);
\r
349 static boost::arg<I> a7_() { return boost::arg<I>(); }
\r
352 template<class A1, class A2, class A3, class A4, class A5, class A6, int I> struct storage7< A1, A2, A3, A4, A5, A6, boost::arg<I> (*) () >: public storage6< A1, A2, A3, A4, A5, A6 >
\r
354 typedef storage6<A1, A2, A3, A4, A5, A6> inherited;
\r
356 storage7( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, boost::arg<I> (*) () ): storage6<A1, A2, A3, A4, A5, A6>( a1, a2, a3, a4, a5, a6 ) {}
\r
358 template<class V> void accept(V & v) const
\r
360 inherited::accept(v);
\r
363 static boost::arg<I> a7_() { return boost::arg<I>(); }
\r
370 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> struct storage8: public storage7< A1, A2, A3, A4, A5, A6, A7 >
\r
372 typedef storage7<A1, A2, A3, A4, A5, A6, A7> inherited;
\r
374 storage8( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8 ): storage7<A1, A2, A3, A4, A5, A6, A7>( a1, a2, a3, a4, a5, a6, a7 ), a8_( a8 ) {}
\r
376 template<class V> void accept(V & v) const
\r
378 inherited::accept(v);
\r
379 BOOST_BIND_VISIT_EACH(v, a8_, 0);
\r
385 #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
\r
387 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, int I> struct storage8< A1, A2, A3, A4, A5, A6, A7, boost::arg<I> >: public storage7< A1, A2, A3, A4, A5, A6, A7 >
\r
389 typedef storage7<A1, A2, A3, A4, A5, A6, A7> inherited;
\r
391 storage8( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, boost::arg<I> ): storage7<A1, A2, A3, A4, A5, A6, A7>( a1, a2, a3, a4, a5, a6, a7 ) {}
\r
393 template<class V> void accept(V & v) const
\r
395 inherited::accept(v);
\r
398 static boost::arg<I> a8_() { return boost::arg<I>(); }
\r
401 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, int I> struct storage8< A1, A2, A3, A4, A5, A6, A7, boost::arg<I> (*) () >: public storage7< A1, A2, A3, A4, A5, A6, A7 >
\r
403 typedef storage7<A1, A2, A3, A4, A5, A6, A7> inherited;
\r
405 storage8( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, boost::arg<I> (*) () ): storage7<A1, A2, A3, A4, A5, A6, A7>( a1, a2, a3, a4, a5, a6, a7 ) {}
\r
407 template<class V> void accept(V & v) const
\r
409 inherited::accept(v);
\r
412 static boost::arg<I> a8_() { return boost::arg<I>(); }
\r
419 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> struct storage9: public storage8< A1, A2, A3, A4, A5, A6, A7, A8 >
\r
421 typedef storage8<A1, A2, A3, A4, A5, A6, A7, A8> inherited;
\r
423 storage9( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9 ): storage8<A1, A2, A3, A4, A5, A6, A7, A8>( a1, a2, a3, a4, a5, a6, a7, a8 ), a9_( a9 ) {}
\r
425 template<class V> void accept(V & v) const
\r
427 inherited::accept(v);
\r
428 BOOST_BIND_VISIT_EACH(v, a9_, 0);
\r
434 #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
\r
436 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, int I> struct storage9< A1, A2, A3, A4, A5, A6, A7, A8, boost::arg<I> >: public storage8< A1, A2, A3, A4, A5, A6, A7, A8 >
\r
438 typedef storage8<A1, A2, A3, A4, A5, A6, A7, A8> inherited;
\r
440 storage9( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, boost::arg<I> ): storage8<A1, A2, A3, A4, A5, A6, A7, A8>( a1, a2, a3, a4, a5, a6, a7, a8 ) {}
\r
442 template<class V> void accept(V & v) const
\r
444 inherited::accept(v);
\r
447 static boost::arg<I> a9_() { return boost::arg<I>(); }
\r
450 template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, int I> struct storage9< A1, A2, A3, A4, A5, A6, A7, A8, boost::arg<I> (*) () >: public storage8< A1, A2, A3, A4, A5, A6, A7, A8 >
\r
452 typedef storage8<A1, A2, A3, A4, A5, A6, A7, A8> inherited;
\r
454 storage9( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, boost::arg<I> (*) () ): storage8<A1, A2, A3, A4, A5, A6, A7, A8>( a1, a2, a3, a4, a5, a6, a7, a8 ) {}
\r
456 template<class V> void accept(V & v) const
\r
458 inherited::accept(v);
\r
461 static boost::arg<I> a9_() { return boost::arg<I>(); }
\r
468 } // namespace boost
\r
471 # pragma warning(default: 4512) // assignment operator could not be generated
\r
472 # pragma warning(pop)
\r
475 #endif // #ifndef BOOST_BIND_STORAGE_HPP_INCLUDED
\r