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