storage.hpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  1. #ifndef BOOST_BIND_STORAGE_HPP_INCLUDED
  2. #define BOOST_BIND_STORAGE_HPP_INCLUDED
  3. // MS compatible compilers support #pragma once
  4. #if defined(_MSC_VER) && (_MSC_VER >= 1020)
  5. # pragma once
  6. #endif
  7. //
  8. // bind/storage.hpp
  9. //
  10. // boost/bind.hpp support header, optimized storage
  11. //
  12. // Copyright (c) 2006 Peter Dimov
  13. //
  14. // Distributed under the Boost Software License, Version 1.0.
  15. // See accompanying file LICENSE_1_0.txt or copy at
  16. // http://www.boost.org/LICENSE_1_0.txt
  17. //
  18. // See http://www.boost.org/libs/bind/bind.html for documentation.
  19. //
  20. #include <boost/config.hpp>
  21. #include <boost/bind/arg.hpp>
  22. #ifdef BOOST_MSVC
  23. # pragma warning(push)
  24. # pragma warning(disable: 4512) // assignment operator could not be generated
  25. #endif
  26. namespace boost
  27. {
  28. namespace _bi
  29. {
  30. // 1
  31. template<class A1> struct storage1
  32. {
  33. explicit storage1( A1 a1 ): a1_( a1 ) {}
  34. template<class V> void accept(V & v) const
  35. {
  36. BOOST_BIND_VISIT_EACH(v, a1_, 0);
  37. }
  38. A1 a1_;
  39. };
  40. #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION ) && !defined( __BORLANDC__ )
  41. template<int I> struct storage1< boost::arg<I> >
  42. {
  43. explicit storage1( boost::arg<I> ) {}
  44. template<class V> void accept(V &) const { }
  45. static boost::arg<I> a1_() { return boost::arg<I>(); }
  46. };
  47. template<int I> struct storage1< boost::arg<I> (*) () >
  48. {
  49. explicit storage1( boost::arg<I> (*) () ) {}
  50. template<class V> void accept(V &) const { }
  51. static boost::arg<I> a1_() { return boost::arg<I>(); }
  52. };
  53. #endif
  54. // 2
  55. template<class A1, class A2> struct storage2: public storage1<A1>
  56. {
  57. typedef storage1<A1> inherited;
  58. storage2( A1 a1, A2 a2 ): storage1<A1>( a1 ), a2_( a2 ) {}
  59. template<class V> void accept(V & v) const
  60. {
  61. inherited::accept(v);
  62. BOOST_BIND_VISIT_EACH(v, a2_, 0);
  63. }
  64. A2 a2_;
  65. };
  66. #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
  67. template<class A1, int I> struct storage2< A1, boost::arg<I> >: public storage1<A1>
  68. {
  69. typedef storage1<A1> inherited;
  70. storage2( A1 a1, boost::arg<I> ): storage1<A1>( a1 ) {}
  71. template<class V> void accept(V & v) const
  72. {
  73. inherited::accept(v);
  74. }
  75. static boost::arg<I> a2_() { return boost::arg<I>(); }
  76. };
  77. template<class A1, int I> struct storage2< A1, boost::arg<I> (*) () >: public storage1<A1>
  78. {
  79. typedef storage1<A1> inherited;
  80. storage2( A1 a1, boost::arg<I> (*) () ): storage1<A1>( a1 ) {}
  81. template<class V> void accept(V & v) const
  82. {
  83. inherited::accept(v);
  84. }
  85. static boost::arg<I> a2_() { return boost::arg<I>(); }
  86. };
  87. #endif
  88. // 3
  89. template<class A1, class A2, class A3> struct storage3: public storage2< A1, A2 >
  90. {
  91. typedef storage2<A1, A2> inherited;
  92. storage3( A1 a1, A2 a2, A3 a3 ): storage2<A1, A2>( a1, a2 ), a3_( a3 ) {}
  93. template<class V> void accept(V & v) const
  94. {
  95. inherited::accept(v);
  96. BOOST_BIND_VISIT_EACH(v, a3_, 0);
  97. }
  98. A3 a3_;
  99. };
  100. #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
  101. template<class A1, class A2, int I> struct storage3< A1, A2, boost::arg<I> >: public storage2< A1, A2 >
  102. {
  103. typedef storage2<A1, A2> inherited;
  104. storage3( A1 a1, A2 a2, boost::arg<I> ): storage2<A1, A2>( a1, a2 ) {}
  105. template<class V> void accept(V & v) const
  106. {
  107. inherited::accept(v);
  108. }
  109. static boost::arg<I> a3_() { return boost::arg<I>(); }
  110. };
  111. template<class A1, class A2, int I> struct storage3< A1, A2, boost::arg<I> (*) () >: public storage2< A1, A2 >
  112. {
  113. typedef storage2<A1, A2> inherited;
  114. storage3( A1 a1, A2 a2, boost::arg<I> (*) () ): storage2<A1, A2>( a1, a2 ) {}
  115. template<class V> void accept(V & v) const
  116. {
  117. inherited::accept(v);
  118. }
  119. static boost::arg<I> a3_() { return boost::arg<I>(); }
  120. };
  121. #endif
  122. // 4
  123. template<class A1, class A2, class A3, class A4> struct storage4: public storage3< A1, A2, A3 >
  124. {
  125. typedef storage3<A1, A2, A3> inherited;
  126. storage4( A1 a1, A2 a2, A3 a3, A4 a4 ): storage3<A1, A2, A3>( a1, a2, a3 ), a4_( a4 ) {}
  127. template<class V> void accept(V & v) const
  128. {
  129. inherited::accept(v);
  130. BOOST_BIND_VISIT_EACH(v, a4_, 0);
  131. }
  132. A4 a4_;
  133. };
  134. #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
  135. template<class A1, class A2, class A3, int I> struct storage4< A1, A2, A3, boost::arg<I> >: public storage3< A1, A2, A3 >
  136. {
  137. typedef storage3<A1, A2, A3> inherited;
  138. storage4( A1 a1, A2 a2, A3 a3, boost::arg<I> ): storage3<A1, A2, A3>( a1, a2, a3 ) {}
  139. template<class V> void accept(V & v) const
  140. {
  141. inherited::accept(v);
  142. }
  143. static boost::arg<I> a4_() { return boost::arg<I>(); }
  144. };
  145. template<class A1, class A2, class A3, int I> struct storage4< A1, A2, A3, boost::arg<I> (*) () >: public storage3< A1, A2, A3 >
  146. {
  147. typedef storage3<A1, A2, A3> inherited;
  148. storage4( A1 a1, A2 a2, A3 a3, boost::arg<I> (*) () ): storage3<A1, A2, A3>( a1, a2, a3 ) {}
  149. template<class V> void accept(V & v) const
  150. {
  151. inherited::accept(v);
  152. }
  153. static boost::arg<I> a4_() { return boost::arg<I>(); }
  154. };
  155. #endif
  156. // 5
  157. template<class A1, class A2, class A3, class A4, class A5> struct storage5: public storage4< A1, A2, A3, A4 >
  158. {
  159. typedef storage4<A1, A2, A3, A4> inherited;
  160. storage5( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ): storage4<A1, A2, A3, A4>( a1, a2, a3, a4 ), a5_( a5 ) {}
  161. template<class V> void accept(V & v) const
  162. {
  163. inherited::accept(v);
  164. BOOST_BIND_VISIT_EACH(v, a5_, 0);
  165. }
  166. A5 a5_;
  167. };
  168. #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
  169. 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 >
  170. {
  171. typedef storage4<A1, A2, A3, A4> inherited;
  172. storage5( A1 a1, A2 a2, A3 a3, A4 a4, boost::arg<I> ): storage4<A1, A2, A3, A4>( a1, a2, a3, a4 ) {}
  173. template<class V> void accept(V & v) const
  174. {
  175. inherited::accept(v);
  176. }
  177. static boost::arg<I> a5_() { return boost::arg<I>(); }
  178. };
  179. 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 >
  180. {
  181. typedef storage4<A1, A2, A3, A4> inherited;
  182. storage5( A1 a1, A2 a2, A3 a3, A4 a4, boost::arg<I> (*) () ): storage4<A1, A2, A3, A4>( a1, a2, a3, a4 ) {}
  183. template<class V> void accept(V & v) const
  184. {
  185. inherited::accept(v);
  186. }
  187. static boost::arg<I> a5_() { return boost::arg<I>(); }
  188. };
  189. #endif
  190. // 6
  191. template<class A1, class A2, class A3, class A4, class A5, class A6> struct storage6: public storage5< A1, A2, A3, A4, A5 >
  192. {
  193. typedef storage5<A1, A2, A3, A4, A5> inherited;
  194. 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 ) {}
  195. template<class V> void accept(V & v) const
  196. {
  197. inherited::accept(v);
  198. BOOST_BIND_VISIT_EACH(v, a6_, 0);
  199. }
  200. A6 a6_;
  201. };
  202. #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
  203. 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 >
  204. {
  205. typedef storage5<A1, A2, A3, A4, A5> inherited;
  206. 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 ) {}
  207. template<class V> void accept(V & v) const
  208. {
  209. inherited::accept(v);
  210. }
  211. static boost::arg<I> a6_() { return boost::arg<I>(); }
  212. };
  213. 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 >
  214. {
  215. typedef storage5<A1, A2, A3, A4, A5> inherited;
  216. 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 ) {}
  217. template<class V> void accept(V & v) const
  218. {
  219. inherited::accept(v);
  220. }
  221. static boost::arg<I> a6_() { return boost::arg<I>(); }
  222. };
  223. #endif
  224. // 7
  225. 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 >
  226. {
  227. typedef storage6<A1, A2, A3, A4, A5, A6> inherited;
  228. 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 ) {}
  229. template<class V> void accept(V & v) const
  230. {
  231. inherited::accept(v);
  232. BOOST_BIND_VISIT_EACH(v, a7_, 0);
  233. }
  234. A7 a7_;
  235. };
  236. #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
  237. 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 >
  238. {
  239. typedef storage6<A1, A2, A3, A4, A5, A6> inherited;
  240. 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 ) {}
  241. template<class V> void accept(V & v) const
  242. {
  243. inherited::accept(v);
  244. }
  245. static boost::arg<I> a7_() { return boost::arg<I>(); }
  246. };
  247. 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 >
  248. {
  249. typedef storage6<A1, A2, A3, A4, A5, A6> inherited;
  250. 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 ) {}
  251. template<class V> void accept(V & v) const
  252. {
  253. inherited::accept(v);
  254. }
  255. static boost::arg<I> a7_() { return boost::arg<I>(); }
  256. };
  257. #endif
  258. // 8
  259. 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 >
  260. {
  261. typedef storage7<A1, A2, A3, A4, A5, A6, A7> inherited;
  262. 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 ) {}
  263. template<class V> void accept(V & v) const
  264. {
  265. inherited::accept(v);
  266. BOOST_BIND_VISIT_EACH(v, a8_, 0);
  267. }
  268. A8 a8_;
  269. };
  270. #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
  271. 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 >
  272. {
  273. typedef storage7<A1, A2, A3, A4, A5, A6, A7> inherited;
  274. 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 ) {}
  275. template<class V> void accept(V & v) const
  276. {
  277. inherited::accept(v);
  278. }
  279. static boost::arg<I> a8_() { return boost::arg<I>(); }
  280. };
  281. 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 >
  282. {
  283. typedef storage7<A1, A2, A3, A4, A5, A6, A7> inherited;
  284. 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 ) {}
  285. template<class V> void accept(V & v) const
  286. {
  287. inherited::accept(v);
  288. }
  289. static boost::arg<I> a8_() { return boost::arg<I>(); }
  290. };
  291. #endif
  292. // 9
  293. 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 >
  294. {
  295. typedef storage8<A1, A2, A3, A4, A5, A6, A7, A8> inherited;
  296. 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 ) {}
  297. template<class V> void accept(V & v) const
  298. {
  299. inherited::accept(v);
  300. BOOST_BIND_VISIT_EACH(v, a9_, 0);
  301. }
  302. A9 a9_;
  303. };
  304. #if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
  305. 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 >
  306. {
  307. typedef storage8<A1, A2, A3, A4, A5, A6, A7, A8> inherited;
  308. 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 ) {}
  309. template<class V> void accept(V & v) const
  310. {
  311. inherited::accept(v);
  312. }
  313. static boost::arg<I> a9_() { return boost::arg<I>(); }
  314. };
  315. 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 >
  316. {
  317. typedef storage8<A1, A2, A3, A4, A5, A6, A7, A8> inherited;
  318. 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 ) {}
  319. template<class V> void accept(V & v) const
  320. {
  321. inherited::accept(v);
  322. }
  323. static boost::arg<I> a9_() { return boost::arg<I>(); }
  324. };
  325. #endif
  326. } // namespace _bi
  327. } // namespace boost
  328. #ifdef BOOST_MSVC
  329. # pragma warning(default: 4512) // assignment operator could not be generated
  330. # pragma warning(pop)
  331. #endif
  332. #endif // #ifndef BOOST_BIND_STORAGE_HPP_INCLUDED