passenger 4.0.20 → 4.0.21

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of passenger might be problematic. Click here for more details.

Files changed (496) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.gitignore +1 -0
  5. data/.travis.yml +1 -1
  6. data/NEWS +15 -0
  7. data/README.md +5 -3
  8. data/Rakefile +1 -0
  9. data/bin/passenger-config +1 -5
  10. data/bin/passenger-install-apache2-module +53 -5
  11. data/bin/passenger-install-nginx-module +19 -6
  12. data/bin/passenger-memory-stats +3 -3
  13. data/build/agents.rb +11 -8
  14. data/build/apache2.rb +9 -5
  15. data/build/basics.rb +15 -21
  16. data/build/common_library.rb +16 -6
  17. data/build/cplusplus_support.rb +5 -5
  18. data/build/cxx_tests.rb +3 -3
  19. data/build/documentation.rb +1 -1
  20. data/build/misc.rb +4 -37
  21. data/build/node_tests.rb +29 -0
  22. data/build/oxt_tests.rb +1 -1
  23. data/build/packaging.rb +29 -10
  24. data/build/preprocessor.rb +2 -1
  25. data/build/test_basics.rb +15 -6
  26. data/debian.template/locations.ini.template +1 -0
  27. data/debian.template/passenger.install.template +1 -0
  28. data/dev/copy_boost_headers.rb +7 -3
  29. data/dev/run_travis.sh +32 -16
  30. data/doc/Users guide Apache.idmap.txt +22 -34
  31. data/doc/Users guide Apache.txt +20 -234
  32. data/doc/Users guide Nginx.idmap.txt +84 -66
  33. data/doc/Users guide Nginx.txt +50 -1
  34. data/doc/Users guide Standalone.idmap.txt +74 -0
  35. data/doc/Users guide Standalone.txt +22 -9
  36. data/doc/Users guide.txt +51 -0
  37. data/doc/users_guide_snippets/environment_variables.txt +0 -3
  38. data/doc/users_guide_snippets/installation.txt +337 -380
  39. data/doc/users_guide_snippets/installation/run_installer.txt +58 -0
  40. data/doc/users_guide_snippets/installation/verify_running_epilogue.txt +6 -0
  41. data/doc/users_guide_snippets/support_information.txt +2 -9
  42. data/doc/users_guide_snippets/troubleshooting/default.txt +112 -0
  43. data/doc/users_guide_snippets/troubleshooting/rails.txt +56 -0
  44. data/doc/users_guide_snippets/where_to_get_support.txt +9 -0
  45. data/ext/apache2/Bucket.h +1 -1
  46. data/ext/apache2/Configuration.hpp +0 -44
  47. data/ext/apache2/CreateDirConfig.cpp +1 -1
  48. data/ext/apache2/CreateDirConfig.cpp.erb +1 -1
  49. data/ext/apache2/Hooks.cpp +28 -21
  50. data/ext/apache2/MergeDirConfig.cpp +1 -0
  51. data/ext/apache2/MergeDirConfig.cpp.erb +1 -1
  52. data/ext/apache2/SetHeaders.cpp +73 -0
  53. data/ext/apache2/SetHeaders.cpp.erb +88 -0
  54. data/ext/boost/algorithm/string/detail/find_format.hpp +5 -5
  55. data/ext/boost/algorithm/string/detail/find_format_all.hpp +5 -5
  56. data/ext/boost/algorithm/string/detail/finder.hpp +1 -1
  57. data/ext/boost/algorithm/string/formatter.hpp +2 -2
  58. data/ext/boost/assert.hpp +6 -1
  59. data/ext/boost/atomic.hpp +18 -0
  60. data/ext/boost/atomic/atomic.hpp +241 -0
  61. data/ext/boost/atomic/detail/base.hpp +585 -0
  62. data/ext/boost/atomic/detail/cas32strong.hpp +885 -0
  63. data/ext/boost/atomic/detail/cas32weak.hpp +947 -0
  64. data/ext/boost/atomic/detail/cas64strong.hpp +443 -0
  65. data/ext/boost/atomic/detail/config.hpp +54 -0
  66. data/ext/boost/atomic/detail/gcc-alpha.hpp +368 -0
  67. data/ext/boost/atomic/detail/gcc-armv6plus.hpp +252 -0
  68. data/ext/boost/atomic/detail/gcc-cas.hpp +157 -0
  69. data/ext/boost/atomic/detail/gcc-ppc.hpp +2850 -0
  70. data/ext/boost/atomic/detail/gcc-sparcv9.hpp +1259 -0
  71. data/ext/boost/atomic/detail/gcc-x86.hpp +1766 -0
  72. data/ext/boost/atomic/detail/generic-cas.hpp +206 -0
  73. data/ext/boost/atomic/detail/interlocked.hpp +200 -0
  74. data/ext/boost/atomic/detail/linux-arm.hpp +189 -0
  75. data/ext/boost/atomic/detail/lockpool.hpp +97 -0
  76. data/ext/boost/atomic/detail/platform.hpp +62 -0
  77. data/ext/boost/atomic/detail/type-classification.hpp +45 -0
  78. data/ext/boost/chrono/config.hpp +8 -3
  79. data/ext/boost/chrono/duration.hpp +9 -10
  80. data/ext/boost/chrono/system_clocks.hpp +1 -1
  81. data/ext/boost/chrono/time_point.hpp +4 -3
  82. data/ext/boost/config/auto_link.hpp +53 -52
  83. data/ext/boost/config/compiler/borland.hpp +1 -0
  84. data/ext/boost/config/compiler/clang.hpp +24 -1
  85. data/ext/boost/config/compiler/codegear.hpp +1 -0
  86. data/ext/boost/config/compiler/common_edg.hpp +1 -0
  87. data/ext/boost/config/compiler/cray.hpp +1 -0
  88. data/ext/boost/config/compiler/digitalmars.hpp +1 -0
  89. data/ext/boost/config/compiler/gcc.hpp +29 -3
  90. data/ext/boost/config/compiler/gcc_xml.hpp +2 -1
  91. data/ext/boost/config/compiler/hp_acc.hpp +1 -0
  92. data/ext/boost/config/compiler/intel.hpp +1 -1
  93. data/ext/boost/config/compiler/metrowerks.hpp +1 -0
  94. data/ext/boost/config/compiler/mpw.hpp +1 -0
  95. data/ext/boost/config/compiler/pathscale.hpp +1 -0
  96. data/ext/boost/config/compiler/pgi.hpp +1 -0
  97. data/ext/boost/config/compiler/sunpro_cc.hpp +1 -0
  98. data/ext/boost/config/compiler/vacpp.hpp +3 -2
  99. data/ext/boost/config/compiler/visualc.hpp +25 -11
  100. data/ext/boost/config/platform/vxworks.hpp +353 -15
  101. data/ext/boost/config/select_compiler_config.hpp +4 -4
  102. data/ext/boost/config/stdlib/dinkumware.hpp +10 -3
  103. data/ext/boost/config/stdlib/libstdcpp3.hpp +2 -1
  104. data/ext/boost/config/suffix.hpp +45 -19
  105. data/ext/boost/date_time/format_date_parser.hpp +1 -11
  106. data/ext/boost/date_time/strings_from_facet.hpp +5 -3
  107. data/ext/boost/detail/atomic_redef_macros.hpp +19 -0
  108. data/ext/boost/detail/atomic_undef_macros.hpp +39 -0
  109. data/ext/boost/detail/endian.hpp +52 -4
  110. data/ext/boost/detail/scoped_enum_emulation.hpp +10 -10
  111. data/ext/boost/detail/select_type.hpp +36 -0
  112. data/ext/boost/exception/current_exception_cast.hpp +1 -1
  113. data/ext/boost/exception/detail/error_info_impl.hpp +3 -5
  114. data/ext/boost/exception/detail/exception_ptr.hpp +3 -3
  115. data/ext/boost/exception/detail/is_output_streamable.hpp +1 -1
  116. data/ext/boost/exception/detail/object_hex_dump.hpp +1 -1
  117. data/ext/boost/exception/detail/type_info.hpp +1 -1
  118. data/ext/boost/exception/diagnostic_information.hpp +15 -14
  119. data/ext/boost/exception/exception.hpp +1 -1
  120. data/ext/boost/exception/get_error_info.hpp +1 -1
  121. data/ext/boost/exception/info.hpp +12 -13
  122. data/ext/boost/exception/to_string.hpp +6 -1
  123. data/ext/boost/exception/to_string_stub.hpp +9 -1
  124. data/ext/boost/foreach.hpp +5 -5
  125. data/ext/boost/function/function_template.hpp +6 -6
  126. data/ext/boost/functional/hash/detail/float_functions.hpp +90 -0
  127. data/ext/boost/functional/hash/detail/hash_float.hpp +11 -2
  128. data/ext/boost/functional/hash/extensions.hpp +14 -2
  129. data/ext/boost/functional/hash/hash.hpp +26 -5
  130. data/ext/boost/get_pointer.hpp +17 -2
  131. data/ext/boost/integer_traits.hpp +1 -1
  132. data/ext/boost/lexical_cast.hpp +615 -395
  133. data/ext/boost/libs/atomic/lockpool.cpp +24 -0
  134. data/ext/boost/libs/system/src/error_code.cpp +25 -18
  135. data/ext/boost/libs/thread/src/future.cpp +7 -5
  136. data/ext/boost/libs/thread/src/pthread/once.cpp +9 -3
  137. data/ext/boost/libs/thread/src/pthread/once_atomic.cpp +90 -0
  138. data/ext/boost/libs/thread/src/pthread/thread.cpp +129 -95
  139. data/ext/boost/libs/thread/src/pthread/timeconv.inl +20 -1
  140. data/ext/boost/limits.hpp +1 -1
  141. data/ext/boost/math/policies/policy.hpp +10 -0
  142. data/ext/boost/math/special_functions/detail/round_fwd.hpp +17 -4
  143. data/ext/boost/math/special_functions/fpclassify.hpp +114 -45
  144. data/ext/boost/math/special_functions/math_fwd.hpp +195 -83
  145. data/ext/boost/math/special_functions/sign.hpp +13 -8
  146. data/ext/boost/math/tools/config.hpp +38 -16
  147. data/ext/boost/move/algorithm.hpp +275 -0
  148. data/ext/boost/move/core.hpp +332 -0
  149. data/ext/boost/move/detail/config_begin.hpp +23 -0
  150. data/ext/boost/move/detail/config_end.hpp +20 -0
  151. data/ext/boost/move/detail/meta_utils.hpp +158 -0
  152. data/ext/boost/move/iterator.hpp +298 -0
  153. data/ext/boost/move/move.hpp +10 -1256
  154. data/ext/boost/move/traits.hpp +142 -0
  155. data/ext/boost/move/utility.hpp +194 -0
  156. data/ext/boost/mpl/assert.hpp +72 -4
  157. data/ext/boost/noncopyable.hpp +15 -3
  158. data/ext/boost/pointer_to_other.hpp +55 -0
  159. data/ext/boost/range/concepts.hpp +4 -4
  160. data/ext/boost/range/detail/extract_optional_type.hpp +1 -1
  161. data/ext/boost/range/empty.hpp +1 -1
  162. data/ext/boost/range/iterator_range_core.hpp +4 -1
  163. data/ext/boost/range/iterator_range_io.hpp +2 -2
  164. data/ext/boost/ratio/config.hpp +6 -0
  165. data/ext/boost/ratio/detail/overflow_helpers.hpp +2 -2
  166. data/ext/boost/smart_ptr/allocate_shared_array.hpp +250 -0
  167. data/ext/boost/smart_ptr/detail/allocate_array_helper.hpp +169 -0
  168. data/ext/boost/smart_ptr/detail/array_deleter.hpp +124 -0
  169. data/ext/boost/smart_ptr/detail/array_traits.hpp +53 -0
  170. data/ext/boost/smart_ptr/detail/array_utility.hpp +178 -0
  171. data/ext/boost/smart_ptr/detail/make_array_helper.hpp +157 -0
  172. data/ext/boost/smart_ptr/detail/operator_bool.hpp +16 -9
  173. data/ext/boost/smart_ptr/detail/shared_count.hpp +78 -7
  174. data/ext/boost/smart_ptr/detail/sp_convertible.hpp +15 -0
  175. data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +12 -6
  176. data/ext/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp +1 -0
  177. data/ext/boost/smart_ptr/detail/sp_counted_base_aix.hpp +1 -0
  178. data/ext/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp +1 -0
  179. data/ext/boost/smart_ptr/detail/sp_counted_base_cw_x86.hpp +1 -0
  180. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp +1 -0
  181. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +1 -0
  182. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp +1 -0
  183. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp +1 -0
  184. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp +1 -0
  185. data/ext/boost/smart_ptr/detail/sp_counted_base_nt.hpp +1 -0
  186. data/ext/boost/smart_ptr/detail/sp_counted_base_pt.hpp +1 -0
  187. data/ext/boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp +162 -0
  188. data/ext/boost/smart_ptr/detail/sp_counted_base_solaris.hpp +1 -0
  189. data/ext/boost/smart_ptr/detail/sp_counted_base_spin.hpp +1 -0
  190. data/ext/boost/smart_ptr/detail/sp_counted_base_sync.hpp +1 -0
  191. data/ext/boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp +1 -0
  192. data/ext/boost/smart_ptr/detail/sp_counted_impl.hpp +15 -0
  193. data/ext/boost/smart_ptr/detail/sp_forward.hpp +39 -0
  194. data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +19 -3
  195. data/ext/boost/smart_ptr/detail/sp_if_array.hpp +31 -0
  196. data/ext/boost/smart_ptr/detail/sp_nullptr_t.hpp +45 -0
  197. data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +5 -12
  198. data/ext/boost/smart_ptr/enable_shared_from_this.hpp +4 -4
  199. data/ext/boost/smart_ptr/make_shared.hpp +5 -1060
  200. data/ext/boost/smart_ptr/make_shared_array.hpp +247 -0
  201. data/ext/boost/smart_ptr/make_shared_object.hpp +1128 -0
  202. data/ext/boost/smart_ptr/scoped_array.hpp +32 -7
  203. data/ext/boost/smart_ptr/scoped_ptr.hpp +31 -5
  204. data/ext/boost/smart_ptr/shared_array.hpp +135 -20
  205. data/ext/boost/smart_ptr/shared_ptr.hpp +444 -126
  206. data/ext/boost/smart_ptr/weak_ptr.hpp +39 -28
  207. data/ext/boost/static_assert.hpp +74 -17
  208. data/ext/boost/system/error_code.hpp +76 -68
  209. data/ext/boost/system/system_error.hpp +5 -1
  210. data/ext/boost/thread/barrier.hpp +6 -2
  211. data/ext/boost/thread/completion_latch.hpp +233 -0
  212. data/ext/boost/thread/condition.hpp +6 -1
  213. data/ext/boost/thread/detail/async_func.hpp +571 -0
  214. data/ext/boost/thread/detail/config.hpp +248 -40
  215. data/ext/boost/thread/detail/counter.hpp +93 -0
  216. data/ext/boost/thread/detail/delete.hpp +12 -0
  217. data/ext/boost/thread/detail/invoke.hpp +1351 -0
  218. data/ext/boost/thread/detail/is_convertible.hpp +48 -0
  219. data/ext/boost/thread/detail/lockable_wrapper.hpp +45 -0
  220. data/ext/boost/thread/detail/log.hpp +83 -0
  221. data/ext/boost/thread/detail/make_tuple_indices.hpp +224 -0
  222. data/ext/boost/thread/detail/move.hpp +32 -16
  223. data/ext/boost/thread/detail/thread.hpp +236 -41
  224. data/ext/boost/thread/detail/thread_group.hpp +55 -9
  225. data/ext/boost/thread/detail/thread_interruption.hpp +4 -1
  226. data/ext/boost/thread/exceptions.hpp +2 -0
  227. data/ext/boost/thread/externally_locked.hpp +351 -0
  228. data/ext/boost/thread/externally_locked_stream.hpp +170 -0
  229. data/ext/boost/thread/future.hpp +2517 -455
  230. data/ext/boost/thread/future_error_code.hpp +61 -0
  231. data/ext/boost/thread/is_locked_by_this_thread.hpp +39 -0
  232. data/ext/boost/thread/latch.hpp +142 -0
  233. data/ext/boost/thread/lock_algorithms.hpp +468 -0
  234. data/ext/boost/thread/lock_concepts.hpp +197 -0
  235. data/ext/boost/thread/lock_factories.hpp +78 -0
  236. data/ext/boost/thread/lock_guard.hpp +88 -0
  237. data/ext/boost/thread/lock_options.hpp +31 -0
  238. data/ext/boost/thread/lock_traits.hpp +45 -0
  239. data/ext/boost/thread/lock_types.hpp +1226 -0
  240. data/ext/boost/thread/lockable_adapter.hpp +226 -0
  241. data/ext/boost/thread/lockable_concepts.hpp +157 -0
  242. data/ext/boost/thread/lockable_traits.hpp +207 -0
  243. data/ext/boost/thread/locks.hpp +5 -1816
  244. data/ext/boost/thread/mutex.hpp +33 -1
  245. data/ext/boost/thread/null_mutex.hpp +243 -0
  246. data/ext/boost/thread/once.hpp +10 -1
  247. data/ext/boost/thread/poly_lockable.hpp +68 -0
  248. data/ext/boost/thread/poly_lockable_adapter.hpp +89 -0
  249. data/ext/boost/thread/poly_shared_lockable.hpp +135 -0
  250. data/ext/boost/thread/poly_shared_lockable_adapter.hpp +170 -0
  251. data/ext/boost/thread/pthread/condition_variable.hpp +74 -26
  252. data/ext/boost/thread/pthread/condition_variable_fwd.hpp +54 -27
  253. data/ext/boost/thread/pthread/mutex.hpp +101 -38
  254. data/ext/boost/thread/pthread/once.hpp +459 -44
  255. data/ext/boost/thread/pthread/once_atomic.hpp +313 -0
  256. data/ext/boost/thread/pthread/recursive_mutex.hpp +19 -10
  257. data/ext/boost/thread/pthread/shared_mutex.hpp +226 -61
  258. data/ext/boost/thread/pthread/shared_mutex_assert.hpp +724 -0
  259. data/ext/boost/thread/pthread/thread_data.hpp +53 -50
  260. data/ext/boost/thread/pthread/timespec.hpp +96 -12
  261. data/ext/boost/thread/recursive_mutex.hpp +44 -1
  262. data/ext/boost/thread/reverse_lock.hpp +3 -2
  263. data/ext/boost/thread/scoped_thread.hpp +285 -0
  264. data/ext/boost/thread/shared_lock_guard.hpp +2 -1
  265. data/ext/boost/thread/shared_mutex.hpp +23 -0
  266. data/ext/boost/thread/strict_lock.hpp +235 -0
  267. data/ext/boost/thread/sync_bounded_queue.hpp +594 -0
  268. data/ext/boost/thread/sync_queue.hpp +516 -0
  269. data/ext/boost/thread/synchronized_value.hpp +1001 -0
  270. data/ext/boost/thread/testable_mutex.hpp +148 -0
  271. data/ext/boost/thread/thread.hpp +1 -13
  272. data/ext/boost/thread/thread_functors.hpp +57 -0
  273. data/ext/boost/thread/thread_guard.hpp +46 -0
  274. data/ext/boost/thread/thread_only.hpp +29 -0
  275. data/ext/boost/thread/v2/shared_mutex.hpp +1062 -0
  276. data/ext/boost/thread/v2/thread.hpp +37 -10
  277. data/ext/boost/thread/xtime.hpp +2 -1
  278. data/ext/boost/token_functions.hpp +16 -16
  279. data/ext/boost/type_traits/add_lvalue_reference.hpp +26 -0
  280. data/ext/boost/type_traits/add_reference.hpp +1 -1
  281. data/ext/boost/type_traits/add_rvalue_reference.hpp +4 -4
  282. data/ext/boost/type_traits/aligned_storage.hpp +13 -0
  283. data/ext/boost/type_traits/common_type.hpp +11 -12
  284. data/ext/boost/type_traits/config.hpp +1 -1
  285. data/ext/boost/type_traits/detail/common_type_imp.hpp +1 -1
  286. data/ext/boost/type_traits/detail/has_binary_operator.hpp +1 -1
  287. data/ext/boost/type_traits/detail/is_function_ptr_tester.hpp +1 -1
  288. data/ext/boost/type_traits/has_left_shift.hpp +49 -0
  289. data/ext/boost/type_traits/has_right_shift.hpp +49 -0
  290. data/ext/boost/type_traits/has_trivial_move_assign.hpp +57 -0
  291. data/ext/boost/type_traits/has_trivial_move_constructor.hpp +57 -0
  292. data/ext/boost/type_traits/intrinsics.hpp +18 -2
  293. data/ext/boost/type_traits/is_abstract.hpp +1 -1
  294. data/ext/boost/type_traits/is_array.hpp +1 -1
  295. data/ext/boost/type_traits/is_const.hpp +1 -1
  296. data/ext/boost/type_traits/is_convertible.hpp +78 -17
  297. data/ext/boost/type_traits/is_function.hpp +6 -1
  298. data/ext/boost/type_traits/is_integral.hpp +6 -1
  299. data/ext/boost/type_traits/is_nothrow_move_assignable.hpp +84 -0
  300. data/ext/boost/type_traits/is_nothrow_move_constructible.hpp +84 -0
  301. data/ext/boost/type_traits/is_pod.hpp +3 -1
  302. data/ext/boost/type_traits/is_rvalue_reference.hpp +1 -1
  303. data/ext/boost/type_traits/is_volatile.hpp +1 -1
  304. data/ext/boost/type_traits/make_signed.hpp +153 -0
  305. data/ext/boost/type_traits/make_unsigned.hpp +16 -0
  306. data/ext/boost/type_traits/remove_const.hpp +1 -1
  307. data/ext/boost/type_traits/remove_cv.hpp +1 -1
  308. data/ext/boost/type_traits/remove_reference.hpp +1 -1
  309. data/ext/boost/type_traits/remove_volatile.hpp +1 -1
  310. data/ext/boost/unordered/detail/allocate.hpp +1120 -0
  311. data/ext/boost/unordered/detail/buckets.hpp +876 -0
  312. data/ext/boost/unordered/detail/equivalent.hpp +680 -0
  313. data/ext/boost/unordered/detail/extract_key.hpp +183 -0
  314. data/ext/boost/unordered/detail/fwd.hpp +23 -0
  315. data/ext/boost/unordered/detail/table.hpp +861 -0
  316. data/ext/boost/unordered/detail/unique.hpp +622 -0
  317. data/ext/boost/unordered/detail/util.hpp +260 -0
  318. data/ext/boost/unordered/unordered_map.hpp +1652 -0
  319. data/ext/boost/unordered/unordered_map_fwd.hpp +65 -0
  320. data/ext/boost/unordered/unordered_set.hpp +1549 -0
  321. data/ext/boost/unordered/unordered_set_fwd.hpp +63 -0
  322. data/ext/boost/unordered_map.hpp +18 -0
  323. data/ext/boost/unordered_set.hpp +18 -0
  324. data/ext/boost/utility/addressof.hpp +2 -2
  325. data/ext/boost/utility/result_of.hpp +8 -1
  326. data/ext/boost/version.hpp +2 -2
  327. data/ext/common/Account.h +1 -1
  328. data/ext/common/AccountsDatabase.h +1 -1
  329. data/ext/common/AgentsStarter.cpp +3 -1
  330. data/ext/common/AgentsStarter.h +2 -2
  331. data/ext/common/ApplicationPool2/AppTypes.cpp +24 -6
  332. data/ext/common/ApplicationPool2/AppTypes.h +17 -8
  333. data/ext/common/ApplicationPool2/Common.h +12 -12
  334. data/ext/common/ApplicationPool2/DirectSpawner.h +2 -2
  335. data/ext/common/ApplicationPool2/DummySpawner.h +3 -3
  336. data/ext/common/ApplicationPool2/Group.h +6 -6
  337. data/ext/common/ApplicationPool2/Implementation.cpp +19 -19
  338. data/ext/common/ApplicationPool2/PipeWatcher.h +5 -5
  339. data/ext/common/ApplicationPool2/Pool.h +21 -21
  340. data/ext/common/ApplicationPool2/Process.h +6 -6
  341. data/ext/common/ApplicationPool2/Session.h +1 -1
  342. data/ext/common/ApplicationPool2/SmartSpawner.h +24 -12
  343. data/ext/common/ApplicationPool2/Socket.h +2 -2
  344. data/ext/common/ApplicationPool2/Spawner.h +64 -14
  345. data/ext/common/ApplicationPool2/SpawnerFactory.h +7 -7
  346. data/ext/common/ApplicationPool2/SuperGroup.h +5 -5
  347. data/ext/common/BackgroundEventLoop.cpp +4 -4
  348. data/ext/common/BackgroundEventLoop.h +1 -1
  349. data/ext/common/Constants.h +13 -1
  350. data/ext/common/EventedBufferedInput.h +8 -8
  351. data/ext/common/Exceptions.cpp +71 -0
  352. data/ext/common/Exceptions.h +60 -7
  353. data/ext/common/FileDescriptor.h +4 -4
  354. data/ext/common/MessageClient.h +1 -1
  355. data/ext/common/MessageServer.h +5 -5
  356. data/ext/common/MultiLibeio.cpp +3 -3
  357. data/ext/common/MultiLibeio.h +2 -2
  358. data/ext/common/RandomGenerator.h +11 -11
  359. data/ext/common/ResourceLocator.h +8 -1
  360. data/ext/common/SafeLibev.h +12 -12
  361. data/ext/common/ServerInstanceDir.h +11 -3
  362. data/ext/common/UnionStation.h +10 -10
  363. data/ext/common/Utils.cpp +11 -13
  364. data/ext/common/Utils.h +9 -9
  365. data/ext/common/Utils/BlockingQueue.h +10 -10
  366. data/ext/common/Utils/BufferedIO.h +1 -1
  367. data/ext/common/Utils/CachedFileStat.hpp +2 -2
  368. data/ext/common/Utils/FileChangeChecker.h +1 -1
  369. data/ext/common/Utils/HashMap.h +13 -4
  370. data/ext/common/Utils/IOUtils.cpp +33 -10
  371. data/ext/common/Utils/IniFile.h +3 -3
  372. data/ext/common/Utils/Lock.h +2 -2
  373. data/ext/common/Utils/MessagePassing.h +10 -10
  374. data/ext/common/Utils/ProcessMetricsCollector.h +24 -6
  375. data/ext/common/Utils/ScopeGuard.h +5 -5
  376. data/ext/common/Utils/jsoncpp.cpp +2 -0
  377. data/ext/common/agents/HelperAgent/FileBackedPipe.h +26 -26
  378. data/ext/common/agents/HelperAgent/Main.cpp +18 -18
  379. data/ext/common/agents/HelperAgent/RequestHandler.cpp +4 -4
  380. data/ext/common/agents/HelperAgent/RequestHandler.h +30 -21
  381. data/ext/common/agents/LoggingAgent/AdminController.h +1 -1
  382. data/ext/common/agents/LoggingAgent/FilterSupport.h +13 -11
  383. data/ext/common/agents/LoggingAgent/LoggingServer.h +11 -11
  384. data/ext/common/agents/LoggingAgent/Main.cpp +9 -9
  385. data/ext/common/agents/LoggingAgent/RemoteSender.h +3 -3
  386. data/ext/common/agents/SpawnPreparer.cpp +1 -0
  387. data/ext/common/agents/Watchdog/AgentWatcher.cpp +8 -7
  388. data/ext/common/agents/Watchdog/Main.cpp +81 -73
  389. data/ext/common/agents/Watchdog/ServerInstanceDirToucher.cpp +1 -1
  390. data/ext/libev/Changes +57 -0
  391. data/ext/libev/LICENSE +2 -1
  392. data/ext/libev/Makefile.in +110 -50
  393. data/ext/libev/README +8 -8
  394. data/ext/libev/aclocal.m4 +1503 -861
  395. data/ext/libev/config.guess +290 -304
  396. data/ext/libev/config.sub +77 -198
  397. data/ext/libev/configure +1735 -890
  398. data/ext/libev/configure.ac +3 -2
  399. data/ext/libev/ev++.h +6 -6
  400. data/ext/libev/ev.c +541 -214
  401. data/ext/libev/ev.h +106 -100
  402. data/ext/libev/ev_epoll.c +1 -1
  403. data/ext/libev/ev_kqueue.c +20 -4
  404. data/ext/libev/ev_vars.h +15 -16
  405. data/ext/libev/ev_win32.c +12 -2
  406. data/ext/libev/ev_wrap.h +162 -160
  407. data/ext/libev/event.c +29 -6
  408. data/ext/libev/event.h +9 -2
  409. data/ext/libev/ltmain.sh +2632 -1384
  410. data/ext/nginx/ConfigurationCommands.c +1 -1
  411. data/ext/nginx/ConfigurationCommands.c.erb +3 -1
  412. data/ext/nginx/ContentHandler.c +25 -2
  413. data/ext/nginx/CreateLocationConfig.c +1 -0
  414. data/ext/nginx/CreateLocationConfig.c.erb +1 -1
  415. data/ext/nginx/MergeLocationConfig.c +1 -0
  416. data/ext/nginx/MergeLocationConfig.c.erb +1 -1
  417. data/ext/nginx/config +12 -0
  418. data/ext/oxt/dynamic_thread_group.hpp +7 -4
  419. data/ext/oxt/system_calls.cpp +5 -1
  420. data/ext/oxt/system_calls.hpp +3 -0
  421. data/helper-scripts/node-loader.js +117 -249
  422. data/lib/phusion_passenger.rb +27 -5
  423. data/lib/phusion_passenger/abstract_installer.rb +104 -9
  424. data/lib/phusion_passenger/admin_tools/memory_stats.rb +10 -9
  425. data/lib/phusion_passenger/apache2/config_options.rb +6 -3
  426. data/lib/phusion_passenger/common_library.rb +7 -1
  427. data/lib/phusion_passenger/constants.rb +6 -0
  428. data/lib/phusion_passenger/loader_shared_helpers.rb +7 -4
  429. data/lib/phusion_passenger/nginx/config_options.rb +2 -1
  430. data/lib/phusion_passenger/packaging.rb +3 -0
  431. data/lib/phusion_passenger/platform_info/apache.rb +43 -6
  432. data/lib/phusion_passenger/platform_info/apache_detector.rb +15 -5
  433. data/lib/phusion_passenger/platform_info/compiler.rb +167 -32
  434. data/lib/phusion_passenger/platform_info/cxx_portability.rb +133 -77
  435. data/lib/phusion_passenger/platform_info/depcheck.rb +17 -7
  436. data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +3 -3
  437. data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
  438. data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -6
  439. data/lib/phusion_passenger/platform_info/linux.rb +2 -1
  440. data/lib/phusion_passenger/platform_info/operating_system.rb +1 -1
  441. data/lib/phusion_passenger/platform_info/ruby.rb +18 -3
  442. data/lib/phusion_passenger/standalone/runtime_installer.rb +6 -2
  443. data/lib/phusion_passenger/standalone/start_command.rb +8 -2
  444. data/lib/phusion_passenger/utils/ansi_colors.rb +9 -0
  445. data/lib/phusion_passenger/utils/hosts_file_parser.rb +4 -2
  446. data/node_lib/phusion_passenger/httplib_emulation.js +141 -0
  447. data/node_lib/phusion_passenger/line_reader.js +154 -0
  448. data/node_lib/phusion_passenger/request_handler.js +65 -0
  449. data/node_lib/phusion_passenger/session_protocol_parser.js +113 -0
  450. data/resources/templates/apache2/deployment_example.txt.erb +2 -1
  451. data/resources/templates/apache2/installing_against_a_different_apache.txt.erb +14 -0
  452. data/resources/templates/apache2/multiple_apache_installations_detected.txt.erb +15 -0
  453. data/resources/templates/apache2/possible_solutions_for_compilation_and_installation_problems.txt.erb +4 -5
  454. data/resources/templates/general_error_with_html.html.template +1 -1
  455. data/resources/templates/installer_common/gem_install_permission_problems.txt.erb +17 -0
  456. data/resources/templates/installer_common/low_amount_of_memory_warning.txt.erb +6 -4
  457. data/resources/templates/installer_common/world_inaccessible_directories.txt.erb +16 -0
  458. data/resources/templates/nginx/deployment_example.txt.erb +2 -1
  459. data/resources/templates/nginx/possible_solutions_for_compilation_and_installation_problems.txt.erb +4 -5
  460. data/resources/templates/standalone/config.erb +1 -0
  461. data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +3 -3
  462. data/test/cxx/ApplicationPool2/PoolTest.cpp +4 -4
  463. data/test/cxx/ApplicationPool2/ProcessTest.cpp +5 -5
  464. data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +5 -5
  465. data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +1 -1
  466. data/test/cxx/EventedBufferedInputTest.cpp +6 -6
  467. data/test/cxx/FileBackedPipeTest.cpp +1 -1
  468. data/test/cxx/MessagePassingTest.cpp +1 -1
  469. data/test/cxx/MessageServerTest.cpp +4 -4
  470. data/test/cxx/RequestHandlerTest.cpp +7 -7
  471. data/test/cxx/UnionStationTest.cpp +2 -2
  472. data/test/node/line_reader_spec.js +338 -0
  473. data/test/node/spec_helper.js +27 -0
  474. data/test/ruby/standalone/runtime_installer_spec.rb +2 -1
  475. metadata +131 -22
  476. metadata.gz.asc +7 -7
  477. data/ext/boost/functional/hash/detail/container_fwd_0x.hpp +0 -29
  478. data/ext/boost/lambda/core.hpp +0 -79
  479. data/ext/boost/lambda/detail/actions.hpp +0 -174
  480. data/ext/boost/lambda/detail/arity_code.hpp +0 -110
  481. data/ext/boost/lambda/detail/function_adaptors.hpp +0 -789
  482. data/ext/boost/lambda/detail/is_instance_of.hpp +0 -104
  483. data/ext/boost/lambda/detail/lambda_config.hpp +0 -48
  484. data/ext/boost/lambda/detail/lambda_functor_base.hpp +0 -615
  485. data/ext/boost/lambda/detail/lambda_functors.hpp +0 -324
  486. data/ext/boost/lambda/detail/lambda_fwd.hpp +0 -74
  487. data/ext/boost/lambda/detail/lambda_traits.hpp +0 -578
  488. data/ext/boost/lambda/detail/member_ptr.hpp +0 -737
  489. data/ext/boost/lambda/detail/operator_actions.hpp +0 -139
  490. data/ext/boost/lambda/detail/operator_lambda_func_base.hpp +0 -271
  491. data/ext/boost/lambda/detail/operator_return_type_traits.hpp +0 -917
  492. data/ext/boost/lambda/detail/operators.hpp +0 -370
  493. data/ext/boost/lambda/detail/ret.hpp +0 -325
  494. data/ext/boost/lambda/detail/return_type_traits.hpp +0 -282
  495. data/ext/boost/lambda/detail/select_functions.hpp +0 -74
  496. data/ext/boost/lambda/lambda.hpp +0 -34
@@ -23,6 +23,17 @@
23
23
  CLASS& operator=(CLASS const&) = delete;
24
24
 
25
25
  #else // BOOST_NO_CXX11_DELETED_FUNCTIONS
26
+ #if defined(BOOST_MSVC) && _MSC_VER >= 1600
27
+ #define BOOST_THREAD_DELETE_COPY_CTOR(CLASS) \
28
+ private: \
29
+ CLASS(CLASS const&); \
30
+ public:
31
+
32
+ #define BOOST_THREAD_DELETE_COPY_ASSIGN(CLASS) \
33
+ private: \
34
+ CLASS& operator=(CLASS const&); \
35
+ public:
36
+ #else
26
37
  #define BOOST_THREAD_DELETE_COPY_CTOR(CLASS) \
27
38
  private: \
28
39
  CLASS(CLASS&); \
@@ -32,6 +43,7 @@
32
43
  private: \
33
44
  CLASS& operator=(CLASS&); \
34
45
  public:
46
+ #endif
35
47
  #endif // BOOST_NO_CXX11_DELETED_FUNCTIONS
36
48
 
37
49
  /**
@@ -0,0 +1,1351 @@
1
+ // Copyright (C) 2012-2013 Vicente J. Botet Escriba
2
+ //
3
+ // Distributed under the Boost Software License, Version 1.0. (See accompanying
4
+ // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
+
6
+ // 2013/04 Vicente J. Botet Escriba
7
+ // Provide implementation up to 9 parameters when BOOST_NO_CXX11_VARIADIC_TEMPLATES is defined.
8
+ // Make use of Boost.Move
9
+ // Make use of Boost.Tuple (movable)
10
+ // 2012 Vicente J. Botet Escriba
11
+ // Provide implementation _RET using bind when BOOST_NO_CXX11_HDR_FUNCTIONAL and BOOST_NO_SFINAE_EXPR are not defined
12
+ // 2012 Vicente J. Botet Escriba
13
+ // Adapt to boost libc++ implementation
14
+
15
+ //===----------------------------------------------------------------------===//
16
+ //
17
+ // The LLVM Compiler Infrastructure
18
+ //
19
+ // This file is dual licensed under the MIT and the University of Illinois Open
20
+ // Source Licenses. See LICENSE.TXT for details.
21
+ //
22
+ // The invoke code is based on the one from libcxx.
23
+ //===----------------------------------------------------------------------===//
24
+
25
+ #ifndef BOOST_THREAD_DETAIL_INVOKE_HPP
26
+ #define BOOST_THREAD_DETAIL_INVOKE_HPP
27
+
28
+ #include <boost/config.hpp>
29
+ #include <boost/static_assert.hpp>
30
+ #include <boost/thread/detail/move.hpp>
31
+ #include <boost/type_traits/is_base_of.hpp>
32
+ #include <boost/type_traits/remove_reference.hpp>
33
+ #ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL
34
+ #include <functional>
35
+ #endif
36
+
37
+ namespace boost
38
+ {
39
+ namespace detail
40
+ {
41
+
42
+
43
+ #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && \
44
+ ! defined(BOOST_NO_SFINAE_EXPR) && \
45
+ ! defined(BOOST_NO_CXX11_DECLTYPE) && \
46
+ ! defined(BOOST_NO_CXX11_DECLTYPE_N3276) && \
47
+ ! defined(BOOST_NO_CXX11_AUTO)
48
+
49
+ #define BOOST_THREAD_PROVIDES_INVOKE
50
+
51
+ #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
52
+ // bullets 1 and 2
53
+
54
+ template <class Fp, class A0, class ...Args>
55
+ inline auto
56
+ invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
57
+ -> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...))
58
+ {
59
+ return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
60
+ }
61
+
62
+ template <class Fp, class A0, class ...Args>
63
+ inline auto
64
+ invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
65
+ -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...))
66
+ {
67
+ return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
68
+ }
69
+
70
+ // bullets 3 and 4
71
+
72
+ template <class Fp, class A0>
73
+ inline auto
74
+ invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
75
+ -> decltype(boost::forward<A0>(a0).*f)
76
+ {
77
+ return boost::forward<A0>(a0).*f;
78
+ }
79
+
80
+ template <class Fp, class A0>
81
+ inline auto
82
+ invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
83
+ -> decltype((*boost::forward<A0>(a0)).*f)
84
+ {
85
+ return (*boost::forward<A0>(a0)).*f;
86
+ }
87
+
88
+ // bullet 5
89
+
90
+ template <class Fp, class ...Args>
91
+ inline auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args)
92
+ -> decltype(boost::forward<Fp>(f)(boost::forward<Args>(args)...))
93
+ {
94
+ return boost::forward<Fp>(f)(boost::forward<Args>(args)...);
95
+ }
96
+ #else // BOOST_NO_CXX11_VARIADIC_TEMPLATES
97
+
98
+ // bullets 1 and 2
99
+
100
+ template <class Fp, class A0>
101
+ inline
102
+ auto
103
+ invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
104
+ -> decltype((boost::forward<A0>(a0).*f)())
105
+ {
106
+ return (boost::forward<A0>(a0).*f)();
107
+ }
108
+ template <class Fp, class A0, class A1>
109
+ inline
110
+ auto
111
+ invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
112
+ -> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(a1)))
113
+ {
114
+ return (boost::forward<A0>(a0).*f)(boost::forward<Args>(a1));
115
+ }
116
+ template <class Fp, class A0, class A1, class A2>
117
+ inline
118
+ auto
119
+ invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
120
+ -> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2)))
121
+ {
122
+ return (boost::forward<A0>(a0).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2));
123
+ }
124
+
125
+ template <class Fp, class A0>
126
+ inline
127
+ auto
128
+ invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
129
+ -> decltype(((*boost::forward<A0>(a0)).*f)())
130
+ {
131
+ return ((*boost::forward<A0>(a0)).*f)();
132
+ }
133
+ template <class Fp, class A0, class A1>
134
+ inline
135
+ auto
136
+ invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
137
+ -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1)))
138
+ {
139
+ return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1));
140
+ }
141
+ template <class Fp, class A0, class A1>
142
+ inline
143
+ auto
144
+ invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
145
+ -> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2)))
146
+ {
147
+ return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2));
148
+ }
149
+
150
+ // bullets 3 and 4
151
+
152
+ template <class Fp, class A0>
153
+ inline
154
+ auto
155
+ invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
156
+ -> decltype(boost::forward<A0>(a0).*f)
157
+ {
158
+ return boost::forward<A0>(a0).*f;
159
+ }
160
+
161
+ template <class Fp, class A0>
162
+ inline
163
+ auto
164
+ invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
165
+ -> decltype((*boost::forward<A0>(a0)).*f)
166
+ {
167
+ return (*boost::forward<A0>(a0)).*f;
168
+ }
169
+
170
+ // bullet 5
171
+
172
+ template <class Fp>
173
+ inline
174
+ auto invoke(BOOST_THREAD_RV_REF(Fp) f)
175
+ -> decltype(boost::forward<Fp>(f)())
176
+ {
177
+ return boost::forward<Fp>(f)();
178
+ }
179
+ template <class Fp, class A1>
180
+ inline
181
+ auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) a1)
182
+ -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1)))
183
+ {
184
+ return boost::forward<Fp>(f)(boost::forward<A1>(a1));
185
+ } template <class Fp, class A1, class A2>
186
+ inline
187
+ auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
188
+ -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2)))
189
+ {
190
+ return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
191
+ }
192
+ template <class Fp, class A1, class A2, class A3>
193
+ inline
194
+ auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
195
+ -> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)))
196
+ {
197
+ return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
198
+ }
199
+
200
+ #endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES
201
+
202
+ #elif ! defined(BOOST_NO_SFINAE_EXPR) && \
203
+ ! defined BOOST_NO_CXX11_HDR_FUNCTIONAL && \
204
+ defined BOOST_MSVC
205
+
206
+ template <class Ret, class Fp>
207
+ inline
208
+ Ret invoke(BOOST_THREAD_RV_REF(Fp) f)
209
+ {
210
+ return f();
211
+ }
212
+ template <class Ret, class Fp, class A1>
213
+ inline
214
+ Ret invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
215
+ {
216
+ return std::bind(boost::forward<Fp>(f), boost::forward<A1>(a1))();
217
+ }
218
+ template <class Ret, class Fp, class A1, class A2>
219
+ inline
220
+ Ret invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
221
+ {
222
+ return std::bind(boost::forward<Fp>(f), boost::forward<A1>(a1), boost::forward<A2>(a2))();
223
+ }
224
+ template <class Ret, class Fp, class A1, class A2, class A3>
225
+ inline
226
+ Ret invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
227
+ {
228
+ return std::bind(boost::forward<Fp>(f), boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3))();
229
+ }
230
+
231
+ #define BOOST_THREAD_PROVIDES_INVOKE_RET
232
+
233
+ #elif ! defined BOOST_MSVC
234
+ //!!!!! WARNING !!!!! THIS DOESN'T WORKS YET
235
+ #define BOOST_THREAD_PROVIDES_INVOKE_RET
236
+
237
+ #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
238
+
239
+ // bullet 1
240
+ // (t1.*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is an object of
241
+ // type T or a reference to an object of type T or a reference to an object of a type derived from T
242
+ template <class Ret, class A, class A0, class ...Args>
243
+ inline
244
+ typename enable_if_c
245
+ <
246
+ is_base_of<A, typename remove_reference<A0>::type>::value,
247
+ Ret
248
+ >::type
249
+ invoke(Ret (A::*f)(Args...), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
250
+ {
251
+ return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
252
+ }
253
+
254
+ template <class Ret, class A, class A0, class ...Args>
255
+ inline
256
+ typename enable_if_c
257
+ <
258
+ is_base_of<A, typename remove_reference<A0>::type>::value,
259
+ Ret
260
+ >::type
261
+ invoke(Ret (A::*f)(Args...) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
262
+ {
263
+ return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
264
+ }
265
+
266
+ template <class Ret, class A, class A0, class ...Args>
267
+ inline
268
+ typename enable_if_c
269
+ <
270
+ is_base_of<A, typename remove_reference<A0>::type>::value,
271
+ Ret
272
+ >::type
273
+ invoke(Ret (A::*f)(Args...) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
274
+ {
275
+ return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
276
+ }
277
+
278
+ template <class Ret, class A, class A0, class ...Args>
279
+ inline
280
+ typename enable_if_c
281
+ <
282
+ is_base_of<A, typename remove_reference<A0>::type>::value,
283
+ Ret
284
+ >::type
285
+ invoke(Ret (A::*f)(Args...) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
286
+ {
287
+ return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
288
+ }
289
+
290
+ // bullet 2
291
+ // ((*t1).*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is not one of
292
+ // the types described in the previous item;
293
+ template <class Ret, class A, class A0, class ...Args>
294
+ inline
295
+ typename enable_if_c
296
+ <
297
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
298
+ Ret
299
+ >::type
300
+ invoke(Ret (A::*f)(Args...), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
301
+ {
302
+ return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
303
+ }
304
+
305
+ template <class Ret, class A, class A0, class ...Args>
306
+ inline
307
+ typename enable_if_c
308
+ <
309
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
310
+ Ret
311
+ >::type
312
+ invoke(Ret (A::*f)(Args...) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
313
+ {
314
+ return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
315
+ }
316
+
317
+ template <class Ret, class A, class A0, class ...Args>
318
+ inline
319
+ typename enable_if_c
320
+ <
321
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
322
+ Ret
323
+ >::type
324
+ invoke(Ret (A::*f)(Args...) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
325
+ {
326
+ return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
327
+ }
328
+
329
+ template <class Ret, class A, class A0, class ...Args>
330
+ inline
331
+ typename enable_if_c
332
+ <
333
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
334
+ Ret
335
+ >::type
336
+ invoke(Ret (A::*f)(Args...) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
337
+ {
338
+ return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
339
+ }
340
+
341
+ // bullet 3
342
+ // t1.*f when N == 1 and f is a pointer to member data of a class T and t1 is an object of type T or a
343
+ // reference to an object of type T or a reference to an object of a type derived from T;
344
+ // template <class Ret, class A, class A0>
345
+ // inline
346
+ // typename enable_if_c
347
+ // <
348
+ // is_base_of<A, typename remove_reference<A0>::type>::value,
349
+ // typename detail::apply_cv<A0, A>::type&
350
+ // >::type
351
+ // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
352
+ // {
353
+ // return boost::forward<A0>(a0).*f;
354
+ // }
355
+
356
+ // bullet 4
357
+ // (*t1).*f when N == 1 and f is a pointer to member data of a class T and t1 is not one of the types
358
+ //described in the previous item;
359
+
360
+ // template <class A0, class Ret, bool>
361
+ // struct d4th_helper
362
+ // {
363
+ // };
364
+ //
365
+ // template <class A0, class Ret>
366
+ // struct d4th_helper<A0, Ret, true>
367
+ // {
368
+ // typedef typename apply_cv<decltype(*declval<A0>()), Ret>::type type;
369
+ // };
370
+ //
371
+ // template <class Ret, class A, class A0>
372
+ // inline
373
+ // typename detail::4th_helper<A, Ret,
374
+ // !is_base_of<A,
375
+ // typename remove_reference<A0>::type
376
+ // >::value
377
+ // >::type&
378
+ // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
379
+ // {
380
+ // return (*boost::forward<A0>(a0)).*f;
381
+ // }
382
+
383
+ // template <class Ret, class A, class A0>
384
+ // inline
385
+ // typename enable_if_c
386
+ // <
387
+ // !is_base_of<A, typename remove_reference<A0>::type>::value,
388
+ // typename detail::ref_return1<Ret A::*, A0>::type
389
+ // >::type
390
+ // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
391
+ // {
392
+ // return (*boost::forward<A0>(a0)).*f;
393
+ // }
394
+
395
+ // bullet 5
396
+ // f(t1, t2, ..., tN) in all other cases.
397
+
398
+ template <class Ret, class Fp, class ...Args>
399
+ inline
400
+ typename enable_if_c
401
+ <
402
+ ! is_member_function_pointer<Fp>::value,
403
+ Ret
404
+ >::type
405
+ invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args)
406
+ {
407
+ return boost::forward<Fp>(f)(boost::forward<Args>(args)...);
408
+ }
409
+ template <class Ret, class ...Args>
410
+ inline Ret
411
+ invoke(Ret(*f)(Args... ), BOOST_THREAD_RV_REF(Args) ...args)
412
+ {
413
+ return f(boost::forward<Args>(args)...);
414
+ }
415
+ #else // BOOST_NO_CXX11_VARIADIC_TEMPLATES
416
+ // bullet 1
417
+ // (t1.*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is an object of
418
+ // type T or a reference to an object of type T or a reference to an object of a type derived from T
419
+
420
+ template <class Ret, class A, class A0>
421
+ inline
422
+ typename enable_if_c
423
+ <
424
+ is_base_of<A, typename remove_reference<A0>::type>::value,
425
+ Ret
426
+ >::type
427
+ invoke(Ret (A::*f)(), BOOST_THREAD_RV_REF(A0) a0)
428
+ {
429
+ return (boost::forward<A0>(a0).*f)();
430
+ }
431
+ template <class Ret, class A, class A0, class A1>
432
+ inline
433
+ typename enable_if_c
434
+ <
435
+ is_base_of<A, typename remove_reference<A0>::type>::value,
436
+ Ret
437
+ >::type
438
+ invoke(Ret (A::*f)(A1), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
439
+ {
440
+ return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
441
+ }
442
+ template <class Ret, class A, class A0, class A1>
443
+ inline
444
+ typename enable_if_c
445
+ <
446
+ is_base_of<A, typename remove_reference<A0>::type>::value,
447
+ Ret
448
+ >::type
449
+ invoke(Ret (A::*f)(A1), A0 a0, A1 a1)
450
+ {
451
+ return (a0.*f)(a1);
452
+ }
453
+ template <class Ret, class A, class A0, class A1, class A2>
454
+ inline
455
+ typename enable_if_c
456
+ <
457
+ is_base_of<A, typename remove_reference<A0>::type>::value,
458
+ Ret
459
+ >::type
460
+ invoke(Ret (A::*f)(A1, A2),
461
+ BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2
462
+ )
463
+ {
464
+ return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
465
+ }
466
+ template <class Ret, class A, class A0, class A1, class A2>
467
+ inline
468
+ typename enable_if_c
469
+ <
470
+ is_base_of<A, typename remove_reference<A0>::type>::value,
471
+ Ret
472
+ >::type
473
+ invoke(Ret (A::*f)(A1, A2), A0 a0, A1 a1, A2 a2)
474
+ {
475
+ return (a0.*f)(a1, a2);
476
+ }
477
+ template <class Ret, class A, class A0, class A1, class A2, class A3>
478
+ inline
479
+ typename enable_if_c
480
+ <
481
+ is_base_of<A, typename remove_reference<A0>::type>::value,
482
+ Ret
483
+ >::type
484
+ invoke(Ret (A::*f)(A1, A2, A3),
485
+ BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
486
+ {
487
+ return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
488
+ }
489
+ template <class Ret, class A, class A0, class A1, class A2, class A3>
490
+ inline
491
+ typename enable_if_c
492
+ <
493
+ is_base_of<A, typename remove_reference<A0>::type>::value,
494
+ Ret
495
+ >::type
496
+ invoke(Ret (A::*f)(A1, A2, A3), A0 a0, A1 a1, A2 a2, A3 a3)
497
+ {
498
+ return (a0.*f)(a1, a2, a3);
499
+ }
500
+
501
+ ///
502
+ template <class Ret, class A, class A0>
503
+ inline
504
+ typename enable_if_c
505
+ <
506
+ is_base_of<A, typename remove_reference<A0>::type>::value,
507
+ Ret
508
+ >::type
509
+ invoke(Ret (A::*f)() const, BOOST_THREAD_RV_REF(A0) a0)
510
+ {
511
+ return (boost::forward<A0>(a0).*f)();
512
+ }
513
+ template <class Ret, class A, class A0, class A1>
514
+ inline
515
+ typename enable_if_c
516
+ <
517
+ is_base_of<A, typename remove_reference<A0>::type>::value,
518
+ Ret
519
+ >::type
520
+ invoke(Ret (A::*f)(A1) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
521
+ {
522
+ return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
523
+ }
524
+ template <class Ret, class A, class A0, class A1>
525
+ inline
526
+ typename enable_if_c
527
+ <
528
+ is_base_of<A, typename remove_reference<A0>::type>::value,
529
+ Ret
530
+ >::type
531
+ invoke(Ret (A::*f)(A1) const, A0 a0, A1 a1)
532
+ {
533
+ return (a0.*f)(a1);
534
+ }
535
+ template <class Ret, class A, class A0, class A1, class A2>
536
+ inline
537
+ typename enable_if_c
538
+ <
539
+ is_base_of<A, typename remove_reference<A0>::type>::value,
540
+ Ret
541
+ >::type
542
+ invoke(Ret (A::*f)(A1, A2) const,
543
+ BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2
544
+ )
545
+ {
546
+ return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)
547
+ );
548
+ }
549
+ template <class Ret, class A, class A0, class A1, class A2>
550
+ inline
551
+ typename enable_if_c
552
+ <
553
+ is_base_of<A, typename remove_reference<A0>::type>::value,
554
+ Ret
555
+ >::type
556
+ invoke(Ret (A::*f)(A1, A2) const, A0 a0, A1 a1, A2 a2)
557
+ {
558
+ return (a0.*f)(a1, a2);
559
+ }
560
+ template <class Ret, class A, class A0, class A1, class A2, class A3>
561
+ inline
562
+ typename enable_if_c
563
+ <
564
+ is_base_of<A, typename remove_reference<A0>::type>::value,
565
+ Ret
566
+ >::type
567
+ invoke(Ret (A::*f)(A1, A2, A3) const,
568
+ BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3
569
+ )
570
+ {
571
+ return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
572
+ }
573
+ template <class Ret, class A, class A0, class A1, class A2, class A3>
574
+ inline
575
+ typename enable_if_c
576
+ <
577
+ is_base_of<A, typename remove_reference<A0>::type>::value,
578
+ Ret
579
+ >::type
580
+ invoke(Ret (A::*f)(A1, A2, A3) const, A0 a0, A1 a1, A2 a2, A3 a3)
581
+ {
582
+ return (a0.*f)(a1, a2, a3);
583
+ }
584
+ ///
585
+ template <class Ret, class A, class A0>
586
+ inline
587
+ typename enable_if_c
588
+ <
589
+ is_base_of<A, typename remove_reference<A0>::type>::value,
590
+ Ret
591
+ >::type
592
+ invoke(Ret (A::*f)() volatile, BOOST_THREAD_RV_REF(A0) a0)
593
+ {
594
+ return (boost::forward<A0>(a0).*f)();
595
+ }
596
+ template <class Ret, class A, class A0, class A1>
597
+ inline
598
+ typename enable_if_c
599
+ <
600
+ is_base_of<A, typename remove_reference<A0>::type>::value,
601
+ Ret
602
+ >::type
603
+ invoke(Ret (A::*f)(A1) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
604
+ {
605
+ return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
606
+ }
607
+ template <class Ret, class A, class A0, class A1>
608
+ inline
609
+ typename enable_if_c
610
+ <
611
+ is_base_of<A, typename remove_reference<A0>::type>::value,
612
+ Ret
613
+ >::type
614
+ invoke(Ret (A::*f)(A1) volatile, A0 a0, A1 a1)
615
+ {
616
+ return (a0.*f)(a1);
617
+ }
618
+ template <class Ret, class A, class A0, class A1, class A2>
619
+ inline
620
+ typename enable_if_c
621
+ <
622
+ is_base_of<A, typename remove_reference<A0>::type>::value,
623
+ Ret
624
+ >::type
625
+ invoke(Ret (A::*f)(A1, A2) volatile,
626
+ BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
627
+ {
628
+ return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
629
+ }
630
+ template <class Ret, class A, class A0, class A1, class A2>
631
+ inline
632
+ typename enable_if_c
633
+ <
634
+ is_base_of<A, typename remove_reference<A0>::type>::value,
635
+ Ret
636
+ >::type
637
+ invoke(Ret (A::*f)(A1, A2) volatile, A0 a0, A1 a1, A2 a2 )
638
+ {
639
+ return (a0.*f)(a1, a2);
640
+ }
641
+ template <class Ret, class A, class A0, class A1, class A2, class A3>
642
+ inline
643
+ typename enable_if_c
644
+ <
645
+ is_base_of<A, typename remove_reference<A0>::type>::value,
646
+ Ret
647
+ >::type
648
+ invoke(Ret (A::*f)(A1, A2, A3) volatile,
649
+ BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3
650
+ )
651
+ {
652
+ return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
653
+ }
654
+ template <class Ret, class A, class A0, class A1, class A2, class A3>
655
+ inline
656
+ typename enable_if_c
657
+ <
658
+ is_base_of<A, typename remove_reference<A0>::type>::value,
659
+ Ret
660
+ >::type
661
+ invoke(Ret (A::*f)(A1, A2, A3) volatile, A0 a0, A1 a1, A2 a2, A3 a3)
662
+ {
663
+ return (a0.*f)(a1, a2, a3);
664
+ }
665
+ ///
666
+ template <class Ret, class A, class A0>
667
+ inline
668
+ typename enable_if_c
669
+ <
670
+ is_base_of<A, typename remove_reference<A0>::type>::value,
671
+ Ret
672
+ >::type
673
+ invoke(Ret (A::*f)() const volatile, BOOST_THREAD_RV_REF(A0) a0)
674
+ {
675
+ return (boost::forward<A0>(a0).*f)();
676
+ }
677
+ template <class Ret, class A, class A0, class A1>
678
+ inline
679
+ typename enable_if_c
680
+ <
681
+ is_base_of<A, typename remove_reference<A0>::type>::value,
682
+ Ret
683
+ >::type
684
+ invoke(Ret (A::*f)(A1) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
685
+ {
686
+ return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
687
+ }
688
+ template <class Ret, class A, class A0, class A1>
689
+ inline
690
+ typename enable_if_c
691
+ <
692
+ is_base_of<A, typename remove_reference<A0>::type>::value,
693
+ Ret
694
+ >::type
695
+ invoke(Ret (A::*f)(A1) const volatile, A0 a0, A1 a1)
696
+ {
697
+ return (a0.*f)(a1);
698
+ }
699
+ template <class Ret, class A, class A0, class A1, class A2>
700
+ inline
701
+ typename enable_if_c
702
+ <
703
+ is_base_of<A, typename remove_reference<A0>::type>::value,
704
+ Ret
705
+ >::type
706
+ invoke(Ret (A::*f)(A1, A2) const volatile,
707
+ BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2
708
+ )
709
+ {
710
+ return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
711
+ }
712
+ template <class Ret, class A, class A0, class A1, class A2>
713
+ inline
714
+ typename enable_if_c
715
+ <
716
+ is_base_of<A, typename remove_reference<A0>::type>::value,
717
+ Ret
718
+ >::type
719
+ invoke(Ret (A::*f)(A1, A2) const volatile,
720
+ A0 a0, A1 a1, A2 a2
721
+ )
722
+ {
723
+ return (a0.*f)(a1, a2);
724
+ }
725
+ template <class Ret, class A, class A0, class A1, class A2, class A3>
726
+ inline
727
+ typename enable_if_c
728
+ <
729
+ is_base_of<A, typename remove_reference<A0>::type>::value,
730
+ Ret
731
+ >::type
732
+ invoke(Ret (A::*f)(A1, A2, A3) const volatile,
733
+ BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3
734
+ )
735
+ {
736
+ return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
737
+ }
738
+ template <class Ret, class A, class A0, class A1, class A2, class A3>
739
+ inline
740
+ typename enable_if_c
741
+ <
742
+ is_base_of<A, typename remove_reference<A0>::type>::value,
743
+ Ret
744
+ >::type
745
+ invoke(Ret (A::*f)(A1, A2, A3) const volatile,
746
+ A0 a0, A1 a1, A2 a2, A3 a3
747
+ )
748
+ {
749
+ return (a0.*f)(a1, a2, a3);
750
+ }
751
+
752
+ // bullet 2
753
+ // ((*t1).*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is not one of
754
+ // the types described in the previous item;
755
+ template <class Ret, class A, class A0>
756
+ inline
757
+ typename enable_if_c
758
+ <
759
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
760
+ Ret
761
+ >::type
762
+ invoke(Ret (A::*f)(), BOOST_THREAD_RV_REF(A0) a0)
763
+ {
764
+ return ((*boost::forward<A0>(a0)).*f)();
765
+ }
766
+ template <class Ret, class A, class A0, class A1>
767
+ inline
768
+ typename enable_if_c
769
+ <
770
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
771
+ Ret
772
+ >::type
773
+ invoke(Ret (A::*f)(A1), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
774
+ {
775
+ return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
776
+ }
777
+ template <class Ret, class A, class A0, class A1>
778
+ inline
779
+ typename enable_if_c
780
+ <
781
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
782
+ Ret
783
+ >::type
784
+ invoke(Ret (A::*f)(A1), A0 a0, A1 a1)
785
+ {
786
+ return ((*a0).*f)(a1);
787
+ }
788
+ template <class Ret, class A, class A0, class A1, class A2>
789
+ inline
790
+ typename enable_if_c
791
+ <
792
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
793
+ Ret
794
+ >::type
795
+ invoke(Ret (A::*f)(A1, BOOST_THREAD_RV_REF(A2)),
796
+ BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
797
+ {
798
+ return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
799
+ }
800
+ template <class Ret, class A, class A0, class A1, class A2>
801
+ inline
802
+ typename enable_if_c
803
+ <
804
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
805
+ Ret
806
+ >::type
807
+ invoke(Ret (A::*f)(A1, A2), A0 a0, A1 a1, A2 a2)
808
+ {
809
+ return ((*a0).*f)(a1, a2);
810
+ }
811
+ template <class Ret, class A, class A0, class A1, class A2, class A3>
812
+ inline
813
+ typename enable_if_c
814
+ <
815
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
816
+ Ret
817
+ >::type
818
+ invoke(Ret (A::*f)(A1, BOOST_THREAD_RV_REF(A2), BOOST_THREAD_RV_REF(A3)),
819
+ BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
820
+ {
821
+ return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)
822
+ );
823
+ }
824
+ template <class Ret, class A, class A0, class A1, class A2, class A3>
825
+ inline
826
+ typename enable_if_c
827
+ <
828
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
829
+ Ret
830
+ >::type
831
+ invoke(Ret (A::*f)(A1, A2, A3), A0 a0, A1 a1, A2 a2, A3 a3)
832
+ {
833
+ return ((*a0).*f)(a1, a2, a3);
834
+ }
835
+
836
+ ///
837
+ template <class Ret, class A, class A0>
838
+ inline
839
+ typename enable_if_c
840
+ <
841
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
842
+ Ret
843
+ >::type
844
+ invoke(Ret (A::*f)() const, BOOST_THREAD_RV_REF(A0) a0)
845
+ {
846
+ return ((*boost::forward<A0>(a0)).*f)();
847
+ }
848
+ template <class Ret, class A, class A0, class A1>
849
+ inline
850
+ typename enable_if_c
851
+ <
852
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
853
+ Ret
854
+ >::type
855
+ invoke(Ret (A::*f)(A1) const,
856
+ BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
857
+ {
858
+ return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
859
+ }
860
+ template <class Ret, class A, class A0, class A1>
861
+ inline
862
+ typename enable_if_c
863
+ <
864
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
865
+ Ret
866
+ >::type
867
+ invoke(Ret (A::*f)(A1) const, BOOST_THREAD_RV_REF(A0) a0, A1 a1)
868
+ {
869
+ return ((*boost::forward<A0>(a0)).*f)(a1);
870
+ }
871
+ template <class Ret, class A, class A0, class A1>
872
+ inline
873
+ typename enable_if_c
874
+ <
875
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
876
+ Ret
877
+ >::type
878
+ invoke(Ret (A::*f)(A1) const, A0 a0, A1 a1)
879
+ {
880
+ return ((*a0).*f)(a1);
881
+ }
882
+ template <class Ret, class A, class A0, class A1, class A2>
883
+ inline
884
+ typename enable_if_c
885
+ <
886
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
887
+ Ret
888
+ >::type
889
+ invoke(Ret (A::*f)(A1, A2) const,
890
+ BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
891
+ {
892
+ return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
893
+ }
894
+ template <class Ret, class A, class A0, class A1, class A2>
895
+ inline
896
+ typename enable_if_c
897
+ <
898
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
899
+ Ret
900
+ >::type
901
+ invoke(Ret (A::*f)(A1, A2) const, A0 a0, A1 a1, A2 a2)
902
+ {
903
+ return ((*a0).*f)(a1, a2);
904
+ }
905
+ template <class Ret, class A, class A0, class A1, class A2, class A3>
906
+ inline
907
+ typename enable_if_c
908
+ <
909
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
910
+ Ret
911
+ >::type
912
+ invoke(Ret (A::*f)(A1, A2, A3) const,
913
+ BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
914
+ {
915
+ return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
916
+ }
917
+ template <class Ret, class A, class A0, class A1, class A2, class A3>
918
+ inline
919
+ typename enable_if_c
920
+ <
921
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
922
+ Ret
923
+ >::type
924
+ invoke(Ret (A::*f)(A1, A2, A3) const,
925
+ A0 a0, A1 a1, A2 a2, A3 a3)
926
+ {
927
+ return ((*a0).*f)(a1, a2, a3);
928
+ }
929
+ ///
930
+ template <class Ret, class A, class A0>
931
+ inline
932
+ typename enable_if_c
933
+ <
934
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
935
+ Ret
936
+ >::type
937
+ invoke(Ret (A::*f)() volatile, BOOST_THREAD_RV_REF(A0) a0)
938
+ {
939
+ return ((*boost::forward<A0>(a0)).*f)();
940
+ }
941
+ template <class Ret, class A, class A0, class A1>
942
+ inline
943
+ typename enable_if_c
944
+ <
945
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
946
+ Ret
947
+ >::type
948
+ invoke(Ret (A::*f)(A1) volatile,
949
+ BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
950
+ {
951
+ return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
952
+ }
953
+ template <class Ret, class A, class A0, class A1>
954
+ inline
955
+ typename enable_if_c
956
+ <
957
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
958
+ Ret
959
+ >::type
960
+ invoke(Ret (A::*f)(A1) volatile, A0 a0, A1 a1)
961
+ {
962
+ return ((*a0).*f)(a1);
963
+ }
964
+ template <class Ret, class A, class A0, class A1, class A2>
965
+ inline
966
+ typename enable_if_c
967
+ <
968
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
969
+ Ret
970
+ >::type
971
+ invoke(Ret (A::*f)(A1, A2) volatile,
972
+ BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
973
+ {
974
+ return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
975
+ }
976
+ template <class Ret, class A, class A0, class A1, class A2>
977
+ inline
978
+ typename enable_if_c
979
+ <
980
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
981
+ Ret
982
+ >::type
983
+ invoke(Ret (A::*f)(A1, A2) volatile, A0 a0, A1 a1, A2 a2)
984
+ {
985
+ return ((*a0).*f)(a1, a2);
986
+ }
987
+ template <class Ret, class A, class A0, class A1, class A2, class A3>
988
+ inline
989
+ typename enable_if_c
990
+ <
991
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
992
+ Ret
993
+ >::type
994
+ invoke(Ret (A::*f)(A1, A2, A3) volatile,
995
+ BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
996
+ {
997
+ return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
998
+ }
999
+ template <class Ret, class A, class A0, class A1, class A2, class A3>
1000
+ inline
1001
+ typename enable_if_c
1002
+ <
1003
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
1004
+ Ret
1005
+ >::type
1006
+ invoke(Ret (A::*f)(A1, A2, A3) volatile, A0 a0, A1 a1, A2 a2, A3 a3)
1007
+ {
1008
+ return ((*a0).*f)(a1, a2, a3);
1009
+ }
1010
+ ///
1011
+ template <class Ret, class A, class A0>
1012
+ inline
1013
+ typename enable_if_c
1014
+ <
1015
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
1016
+ Ret
1017
+ >::type
1018
+ invoke(Ret (A::*f)() const volatile, BOOST_THREAD_RV_REF(A0) a0)
1019
+ {
1020
+ return ((*boost::forward<A0>(a0)).*f)();
1021
+ }
1022
+ template <class Ret, class A, class A0>
1023
+ inline
1024
+ typename enable_if_c
1025
+ <
1026
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
1027
+ Ret
1028
+ >::type
1029
+ invoke(Ret (A::*f)() const volatile, A0 a0)
1030
+ {
1031
+ return ((*a0).*f)();
1032
+ }
1033
+ template <class Ret, class A, class A0, class A1>
1034
+ inline
1035
+ typename enable_if_c
1036
+ <
1037
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
1038
+ Ret
1039
+ >::type
1040
+ invoke(Ret (A::*f)(A1) const volatile,
1041
+ BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
1042
+ {
1043
+ return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
1044
+ }
1045
+ template <class Ret, class A, class A0, class A1>
1046
+ inline
1047
+ typename enable_if_c
1048
+ <
1049
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
1050
+ Ret
1051
+ >::type
1052
+ invoke(Ret (A::*f)(A1) const volatile, A0 a0, A1 a1)
1053
+ {
1054
+ return ((*a0).*f)(a1);
1055
+ }
1056
+ template <class Ret, class A, class A0, class A1, class A2>
1057
+ inline
1058
+ typename enable_if_c
1059
+ <
1060
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
1061
+ Ret
1062
+ >::type
1063
+ invoke(Ret (A::*f)(A1, A2) const volatile,
1064
+ BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1065
+ {
1066
+ return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
1067
+ }
1068
+ template <class Ret, class A, class A0, class A1, class A2>
1069
+ inline
1070
+ typename enable_if_c
1071
+ <
1072
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
1073
+ Ret
1074
+ >::type
1075
+ invoke(Ret (A::*f)(A1, A2) const volatile,
1076
+ A0 a0, A1 a1, A2 a2)
1077
+ {
1078
+ return ((*a0).*f)(a1, a2);
1079
+ }
1080
+ template <class Ret, class A, class A0, class A1, class A2, class A3>
1081
+ inline
1082
+ typename enable_if_c
1083
+ <
1084
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
1085
+ Ret
1086
+ >::type
1087
+ invoke(Ret (A::*f)(A1, A2, A3) const volatile,
1088
+ BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1089
+ {
1090
+ return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1091
+ }
1092
+ template <class Ret, class A, class A0, class A1, class A2, class A3>
1093
+ inline
1094
+ typename enable_if_c
1095
+ <
1096
+ ! is_base_of<A, typename remove_reference<A0>::type>::value,
1097
+ Ret
1098
+ >::type
1099
+ invoke(Ret (A::*f)(A1, A2, A3) const volatile,
1100
+ A0 a0, A1 a1, A2 a2, A3 a3)
1101
+ {
1102
+ return ((*a0).*f)(a1, a2, a3);
1103
+ }
1104
+ // bullet 3
1105
+ // t1.*f when N == 1 and f is a pointer to member data of a class T and t1 is an object of type T or a
1106
+ // reference to an object of type T or a reference to an object of a type derived from T;
1107
+ // template <class Ret, class A, class A0>
1108
+ // inline
1109
+ // typename enable_if_c
1110
+ // <
1111
+ // is_base_of<A, typename remove_reference<A0>::type>::value,
1112
+ // typename detail::apply_cv<A0, A>::type&
1113
+ // >::type
1114
+ // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
1115
+ // {
1116
+ // return boost::forward<A0>(a0).*f;
1117
+ // }
1118
+
1119
+ // bullet 4
1120
+ // (*t1).*f when N == 1 and f is a pointer to member data of a class T and t1 is not one of the types
1121
+ //described in the previous item;
1122
+
1123
+ // template <class A0, class Ret, bool>
1124
+ // struct d4th_helper
1125
+ // {
1126
+ // };
1127
+ //
1128
+ // template <class A0, class Ret>
1129
+ // struct d4th_helper<A0, Ret, true>
1130
+ // {
1131
+ // typedef typename apply_cv<decltype(*declval<A0>()), Ret>::type type;
1132
+ // };
1133
+ //
1134
+ // template <class Ret, class A, class A0>
1135
+ // inline
1136
+ // typename detail::4th_helper<A, Ret,
1137
+ // !is_base_of<A,
1138
+ // typename remove_reference<A0>::type
1139
+ // >::value
1140
+ // >::type&
1141
+ // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
1142
+ // {
1143
+ // return (*boost::forward<A0>(a0)).*f;
1144
+ // }
1145
+
1146
+ // template <class Ret, class A, class A0>
1147
+ // inline
1148
+ // typename enable_if_c
1149
+ // <
1150
+ // !is_base_of<A, typename remove_reference<A0>::type>::value,
1151
+ // typename detail::ref_return1<Ret A::*, A0>::type
1152
+ // >::type
1153
+ // invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
1154
+ // {
1155
+ // return (*boost::forward<A0>(a0)).*f;
1156
+ // }
1157
+
1158
+ // bullet 5
1159
+ // f(t1, t2, ..., tN) in all other cases.
1160
+
1161
+ template <class Ret, class Fp>
1162
+ inline
1163
+ typename enable_if_c
1164
+ <
1165
+ ! is_member_function_pointer<Fp>::value,
1166
+ Ret
1167
+ >::type
1168
+ invoke(BOOST_THREAD_RV_REF(Fp) f)
1169
+ {
1170
+ return boost::forward<Fp>(f)();
1171
+ }
1172
+ template <class Ret, class Fp, class A1>
1173
+ inline
1174
+ typename enable_if_c
1175
+ <
1176
+ ! is_member_function_pointer<Fp>::value,
1177
+ Ret
1178
+ >::type
1179
+ invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
1180
+ {
1181
+ return boost::forward<Fp>(f)(boost::forward<A1>(a1));
1182
+ }
1183
+ template <class Ret, class Fp, class A1>
1184
+ inline
1185
+ typename enable_if_c
1186
+ <
1187
+ ! is_member_function_pointer<Fp>::value,
1188
+ Ret
1189
+ >::type
1190
+ invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1)
1191
+ {
1192
+ return boost::forward<Fp>(f)(a1);
1193
+ }
1194
+ template <class Ret, class Fp, class A1, class A2>
1195
+ inline
1196
+ typename enable_if_c
1197
+ <
1198
+ ! is_member_function_pointer<Fp>::value,
1199
+ Ret
1200
+ >::type
1201
+ invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1202
+ {
1203
+ return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
1204
+ }
1205
+ template <class Ret, class Fp, class A1, class A2>
1206
+ inline
1207
+ typename enable_if_c
1208
+ <
1209
+ ! is_member_function_pointer<Fp>::value,
1210
+ Ret
1211
+ >::type
1212
+ invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1, A2 a2)
1213
+ {
1214
+ return boost::forward<Fp>(f)(a1, a2);
1215
+ }
1216
+ template <class Ret, class Fp, class A1, class A2, class A3>
1217
+ inline
1218
+ typename enable_if_c
1219
+ <
1220
+ ! is_member_function_pointer<Fp>::value,
1221
+ Ret
1222
+ >::type
1223
+ invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1224
+ {
1225
+ return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1226
+ }
1227
+ template <class Ret, class Fp, class A1, class A2, class A3>
1228
+ inline
1229
+ typename enable_if_c
1230
+ <
1231
+ ! is_member_function_pointer<Fp>::value,
1232
+ Ret
1233
+ >::type
1234
+ invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1, A2 a2, A3 a3)
1235
+ {
1236
+ return boost::forward<Fp>(f)(a1, a2, a3);
1237
+ }
1238
+
1239
+ ///
1240
+ template <class Ret, class Fp>
1241
+ inline
1242
+ typename enable_if_c
1243
+ <
1244
+ ! is_member_function_pointer<Fp>::value,
1245
+ Ret
1246
+ >::type
1247
+ invoke(Fp const &f)
1248
+ {
1249
+ return f();
1250
+ }
1251
+ template <class Ret, class Fp, class A1>
1252
+ inline
1253
+ typename enable_if_c
1254
+ <
1255
+ ! is_member_function_pointer<Fp>::value,
1256
+ Ret
1257
+ >::type
1258
+ invoke(Fp const &f, BOOST_THREAD_RV_REF(A1) a1)
1259
+ {
1260
+ return f(boost::forward<A1>(a1));
1261
+ }
1262
+ template <class Ret, class Fp, class A1>
1263
+ inline
1264
+ typename enable_if_c
1265
+ <
1266
+ ! is_member_function_pointer<Fp>::value,
1267
+ Ret
1268
+ >::type
1269
+ invoke(Fp const &f, A1 a1)
1270
+ {
1271
+ return f(a1);
1272
+ }
1273
+ template <class Ret, class Fp, class A1, class A2>
1274
+ inline
1275
+ typename enable_if_c
1276
+ <
1277
+ ! is_member_function_pointer<Fp>::value,
1278
+ Ret
1279
+ >::type
1280
+ invoke(Fp const &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1281
+ {
1282
+ return f(boost::forward<A1>(a1), boost::forward<A2>(a2));
1283
+ }
1284
+ template <class Ret, class Fp, class A1, class A2>
1285
+ inline
1286
+ typename enable_if_c
1287
+ <
1288
+ ! is_member_function_pointer<Fp>::value,
1289
+ Ret
1290
+ >::type
1291
+ invoke(Fp const &f, A1 a1, A2 a2)
1292
+ {
1293
+ return f(a1, a2);
1294
+ }
1295
+ template <class Ret, class Fp, class A1, class A2, class A3>
1296
+ inline
1297
+ typename enable_if_c
1298
+ <
1299
+ ! is_member_function_pointer<Fp>::value,
1300
+ Ret
1301
+ >::type
1302
+ invoke(Fp const &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1303
+ {
1304
+ return f(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1305
+ }
1306
+ template <class Ret, class Fp, class A1, class A2, class A3>
1307
+ inline
1308
+ typename enable_if_c
1309
+ <
1310
+ ! is_member_function_pointer<Fp>::value,
1311
+ Ret
1312
+ >::type
1313
+ invoke(Fp const &f, A1 a1, A2 a2, A3 a3)
1314
+ {
1315
+ return f(a1, a2, a3);
1316
+ }
1317
+ ///
1318
+
1319
+ template <class Ret>
1320
+ inline Ret
1321
+ invoke(Ret(*f)())
1322
+ {
1323
+ return f();
1324
+ }
1325
+ template <class Ret, class A1>
1326
+ inline Ret
1327
+ invoke(Ret(*f)(A1), BOOST_THREAD_RV_REF(A1) a1)
1328
+ {
1329
+ return f(boost::forward<A1>(a1));
1330
+ }
1331
+ template <class Ret, class A1, class A2>
1332
+ inline Ret
1333
+ invoke(Ret(*f)(A1, A2),
1334
+ BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
1335
+ {
1336
+ return f(boost::forward<A1>(a1), boost::forward<A2>(a2));
1337
+ }
1338
+ template <class Ret, class A1, class A2, class A3>
1339
+ inline Ret
1340
+ invoke(Ret(*f)(A1, A2, A3),
1341
+ BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
1342
+ {
1343
+ return f(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
1344
+ }
1345
+ #endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES
1346
+
1347
+ #endif // all
1348
+ }
1349
+ }
1350
+
1351
+ #endif // header