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
@@ -34,7 +34,7 @@ struct remove_rvalue_ref
34
34
  {
35
35
  typedef T type;
36
36
  };
37
- #ifndef BOOST_NO_RVALUE_REFERENCES
37
+ #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
38
38
  template <class T>
39
39
  struct remove_rvalue_ref<T&&>
40
40
  {
@@ -57,7 +57,7 @@ struct remove_volatile_impl
57
57
  // We can't filter out rvalue_references at the same level as
58
58
  // references or we get ambiguities from msvc:
59
59
  //
60
- #ifndef BOOST_NO_RVALUE_REFERENCES
60
+ #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
61
61
  template <typename T>
62
62
  struct remove_volatile_impl<T&&>
63
63
  {
@@ -0,0 +1,1120 @@
1
+
2
+ // Copyright 2005-2011 Daniel James.
3
+ // Copyright 2009 Pablo Halpern.
4
+ // Distributed under the Boost Software License, Version 1.0. (See accompanying
5
+ // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6
+
7
+ // See http://www.boost.org/libs/unordered for documentation
8
+
9
+ #ifndef BOOST_UNORDERED_ALLOCATE_HPP
10
+ #define BOOST_UNORDERED_ALLOCATE_HPP
11
+
12
+ #if defined(_MSC_VER) && (_MSC_VER >= 1020)
13
+ # pragma once
14
+ #endif
15
+
16
+ #include <boost/unordered/detail/fwd.hpp>
17
+ #include <boost/move/move.hpp>
18
+ #include <boost/preprocessor/cat.hpp>
19
+ #include <boost/preprocessor/inc.hpp>
20
+ #include <boost/preprocessor/dec.hpp>
21
+ #include <boost/preprocessor/repetition/enum.hpp>
22
+ #include <boost/preprocessor/repetition/enum_params.hpp>
23
+ #include <boost/preprocessor/repetition/enum_binary_params.hpp>
24
+ #include <boost/preprocessor/repetition/repeat_from_to.hpp>
25
+ #include <boost/type_traits/is_class.hpp>
26
+ #include <boost/type_traits/add_lvalue_reference.hpp>
27
+ #include <boost/tuple/tuple.hpp>
28
+ #include <boost/utility/enable_if.hpp>
29
+ #include <boost/utility/addressof.hpp>
30
+ #include <boost/detail/select_type.hpp>
31
+ #include <boost/assert.hpp>
32
+ #include <utility>
33
+
34
+ #if !defined(BOOST_NO_CXX11_HDR_TUPLE)
35
+ #include <tuple>
36
+ #endif
37
+
38
+ #if defined(BOOST_MSVC)
39
+ #pragma warning(push)
40
+ #pragma warning(disable:4512) // assignment operator could not be generated.
41
+ #pragma warning(disable:4345) // behavior change: an object of POD type
42
+ // constructed with an initializer of the form ()
43
+ // will be default-initialized.
44
+ #endif
45
+
46
+ #define BOOST_UNORDERED_EMPLACE_LIMIT 10
47
+
48
+ namespace boost { namespace unordered { namespace detail {
49
+
50
+ ////////////////////////////////////////////////////////////////////////////
51
+ // Bits and pieces for implementing traits
52
+
53
+ template <typename T> typename boost::add_lvalue_reference<T>::type make();
54
+ struct choice9 { typedef char (&type)[9]; };
55
+ struct choice8 : choice9 { typedef char (&type)[8]; };
56
+ struct choice7 : choice8 { typedef char (&type)[7]; };
57
+ struct choice6 : choice7 { typedef char (&type)[6]; };
58
+ struct choice5 : choice6 { typedef char (&type)[5]; };
59
+ struct choice4 : choice5 { typedef char (&type)[4]; };
60
+ struct choice3 : choice4 { typedef char (&type)[3]; };
61
+ struct choice2 : choice3 { typedef char (&type)[2]; };
62
+ struct choice1 : choice2 { typedef char (&type)[1]; };
63
+ choice1 choose();
64
+
65
+ typedef choice1::type yes_type;
66
+ typedef choice2::type no_type;
67
+
68
+ struct private_type
69
+ {
70
+ private_type const &operator,(int) const;
71
+ };
72
+
73
+ template <typename T>
74
+ no_type is_private_type(T const&);
75
+ yes_type is_private_type(private_type const&);
76
+
77
+ struct convert_from_anything {
78
+ template <typename T>
79
+ convert_from_anything(T const&);
80
+ };
81
+
82
+ ////////////////////////////////////////////////////////////////////////////
83
+ // emplace_args
84
+ //
85
+ // Either forwarding variadic arguments, or storing the arguments in
86
+ // emplace_args##n
87
+
88
+ #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
89
+
90
+ #define BOOST_UNORDERED_EMPLACE_TEMPLATE typename... Args
91
+ #define BOOST_UNORDERED_EMPLACE_ARGS BOOST_FWD_REF(Args)... args
92
+ #define BOOST_UNORDERED_EMPLACE_FORWARD boost::forward<Args>(args)...
93
+
94
+ #define BOOST_UNORDERED_EMPLACE_ARGS1(a0) a0
95
+ #define BOOST_UNORDERED_EMPLACE_ARGS2(a0, a1) a0, a1
96
+ #define BOOST_UNORDERED_EMPLACE_ARGS3(a0, a1, a2) a0, a1, a2
97
+
98
+ #else
99
+
100
+ #define BOOST_UNORDERED_EMPLACE_TEMPLATE typename Args
101
+ #define BOOST_UNORDERED_EMPLACE_ARGS Args const& args
102
+ #define BOOST_UNORDERED_EMPLACE_FORWARD args
103
+
104
+ #define BOOST_UNORDERED_FWD_PARAM(z, n, a) \
105
+ BOOST_FWD_REF(BOOST_PP_CAT(A, n)) BOOST_PP_CAT(a, n)
106
+
107
+ #define BOOST_UNORDERED_CALL_FORWARD(z, i, a) \
108
+ boost::forward<BOOST_PP_CAT(A,i)>(BOOST_PP_CAT(a,i))
109
+
110
+ #define BOOST_UNORDERED_EARGS(z, n, _) \
111
+ template <BOOST_PP_ENUM_PARAMS_Z(z, n, typename A)> \
112
+ struct BOOST_PP_CAT(emplace_args, n) \
113
+ { \
114
+ BOOST_PP_REPEAT_##z(n, BOOST_UNORDERED_EARGS_MEMBER, _) \
115
+ BOOST_PP_CAT(emplace_args, n) ( \
116
+ BOOST_PP_ENUM_BINARY_PARAMS_Z(z, n, Arg, b) \
117
+ ) : BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_EARGS_INIT, _) \
118
+ {} \
119
+ \
120
+ }; \
121
+ \
122
+ template <BOOST_PP_ENUM_PARAMS_Z(z, n, typename A)> \
123
+ inline BOOST_PP_CAT(emplace_args, n) < \
124
+ BOOST_PP_ENUM_PARAMS_Z(z, n, A) \
125
+ > create_emplace_args( \
126
+ BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_FWD_PARAM, b) \
127
+ ) \
128
+ { \
129
+ BOOST_PP_CAT(emplace_args, n) < \
130
+ BOOST_PP_ENUM_PARAMS_Z(z, n, A) \
131
+ > e(BOOST_PP_ENUM_PARAMS_Z(z, n, b)); \
132
+ return e; \
133
+ }
134
+
135
+ #define BOOST_UNORDERED_EMPLACE_ARGS1 create_emplace_args
136
+ #define BOOST_UNORDERED_EMPLACE_ARGS2 create_emplace_args
137
+ #define BOOST_UNORDERED_EMPLACE_ARGS3 create_emplace_args
138
+
139
+ #if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
140
+
141
+ #define BOOST_UNORDERED_EARGS_MEMBER(z, n, _) \
142
+ typedef BOOST_FWD_REF(BOOST_PP_CAT(A, n)) BOOST_PP_CAT(Arg, n); \
143
+ BOOST_PP_CAT(Arg, n) BOOST_PP_CAT(a, n);
144
+
145
+ #define BOOST_UNORDERED_EARGS_INIT(z, n, _) \
146
+ BOOST_PP_CAT(a, n)( \
147
+ boost::forward<BOOST_PP_CAT(A,n)>(BOOST_PP_CAT(b, n)))
148
+
149
+ #else
150
+
151
+ #define BOOST_UNORDERED_EARGS_MEMBER(z, n, _) \
152
+ typedef typename boost::add_lvalue_reference<BOOST_PP_CAT(A, n)>::type \
153
+ BOOST_PP_CAT(Arg, n); \
154
+ BOOST_PP_CAT(Arg, n) BOOST_PP_CAT(a, n);
155
+
156
+ #define BOOST_UNORDERED_EARGS_INIT(z, n, _) \
157
+ BOOST_PP_CAT(a, n)(BOOST_PP_CAT(b, n))
158
+
159
+ #endif
160
+
161
+ BOOST_PP_REPEAT_FROM_TO(1, BOOST_UNORDERED_EMPLACE_LIMIT, BOOST_UNORDERED_EARGS,
162
+ _)
163
+
164
+ #undef BOOST_UNORDERED_DEFINE_EMPLACE_ARGS
165
+ #undef BOOST_UNORDERED_EARGS_MEMBER
166
+ #undef BOOST_UNORDERED_EARGS_INIT
167
+
168
+ #endif
169
+
170
+ }}}
171
+
172
+ ////////////////////////////////////////////////////////////////////////////////
173
+ //
174
+ // Pick which version of allocator_traits to use
175
+ //
176
+ // 0 = Own partial implementation
177
+ // 1 = std::allocator_traits
178
+ // 2 = boost::container::allocator_traits
179
+
180
+ #if !defined(BOOST_UNORDERED_USE_ALLOCATOR_TRAITS)
181
+ # if defined(__GXX_EXPERIMENTAL_CXX0X__) && \
182
+ (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))
183
+ # define BOOST_UNORDERED_USE_ALLOCATOR_TRAITS 0
184
+ # elif defined(BOOST_MSVC)
185
+ # if BOOST_MSVC < 1400
186
+ // Use container's allocator_traits for older versions of Visual
187
+ // C++ as I don't test with them.
188
+ # define BOOST_UNORDERED_USE_ALLOCATOR_TRAITS 2
189
+ # endif
190
+ # endif
191
+ #endif
192
+
193
+ #if !defined(BOOST_UNORDERED_USE_ALLOCATOR_TRAITS)
194
+ # define BOOST_UNORDERED_USE_ALLOCATOR_TRAITS 0
195
+ #endif
196
+
197
+ ////////////////////////////////////////////////////////////////////////////////
198
+ //
199
+ // Some utilities for implementing allocator_traits, but useful elsewhere so
200
+ // they're always defined.
201
+
202
+ #if !defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS)
203
+ # include <type_traits>
204
+ #endif
205
+
206
+ namespace boost { namespace unordered { namespace detail {
207
+
208
+ ////////////////////////////////////////////////////////////////////////////
209
+ // Integral_constrant, true_type, false_type
210
+ //
211
+ // Uses the standard versions if available.
212
+
213
+ #if !defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS)
214
+
215
+ using std::integral_constant;
216
+ using std::true_type;
217
+ using std::false_type;
218
+
219
+ #else
220
+
221
+ template <typename T, T Value>
222
+ struct integral_constant { enum { value = Value }; };
223
+
224
+ typedef boost::unordered::detail::integral_constant<bool, true> true_type;
225
+ typedef boost::unordered::detail::integral_constant<bool, false> false_type;
226
+
227
+ #endif
228
+
229
+ ////////////////////////////////////////////////////////////////////////////
230
+ // Explicitly call a destructor
231
+
232
+ #if defined(BOOST_MSVC)
233
+ #pragma warning(push)
234
+ #pragma warning(disable:4100) // unreferenced formal parameter
235
+ #endif
236
+
237
+ template <class T>
238
+ inline void destroy(T* x) {
239
+ x->~T();
240
+ }
241
+
242
+ #if defined(BOOST_MSVC)
243
+ #pragma warning(pop)
244
+ #endif
245
+
246
+ ////////////////////////////////////////////////////////////////////////////
247
+ // Expression test mechanism
248
+ //
249
+ // When SFINAE expressions are available, define
250
+ // BOOST_UNORDERED_HAS_FUNCTION which can check if a function call is
251
+ // supported by a class, otherwise define BOOST_UNORDERED_HAS_MEMBER which
252
+ // can detect if a class has the specified member, but not that it has the
253
+ // correct type, this is good enough for a passable impression of
254
+ // allocator_traits.
255
+
256
+ #if !defined(BOOST_NO_SFINAE_EXPR)
257
+
258
+ template <typename T, unsigned int> struct expr_test;
259
+ template <typename T> struct expr_test<T, sizeof(char)> : T {};
260
+ template <typename U> static char for_expr_test(U const&);
261
+
262
+ # define BOOST_UNORDERED_CHECK_EXPRESSION(count, result, expression) \
263
+ template <typename U> \
264
+ static typename boost::unordered::detail::expr_test< \
265
+ BOOST_PP_CAT(choice, result), \
266
+ sizeof(boost::unordered::detail::for_expr_test(( \
267
+ (expression), \
268
+ 0)))>::type test( \
269
+ BOOST_PP_CAT(choice, count))
270
+
271
+ # define BOOST_UNORDERED_DEFAULT_EXPRESSION(count, result) \
272
+ template <typename U> \
273
+ static BOOST_PP_CAT(choice, result)::type test( \
274
+ BOOST_PP_CAT(choice, count))
275
+
276
+ # define BOOST_UNORDERED_HAS_FUNCTION(name, thing, args, _) \
277
+ struct BOOST_PP_CAT(has_, name) \
278
+ { \
279
+ BOOST_UNORDERED_CHECK_EXPRESSION(1, 1, \
280
+ boost::unordered::detail::make< thing >().name args); \
281
+ BOOST_UNORDERED_DEFAULT_EXPRESSION(2, 2); \
282
+ \
283
+ enum { value = sizeof(test<T>(choose())) == sizeof(choice1::type) };\
284
+ }
285
+
286
+ #else
287
+
288
+ template <typename T> struct identity { typedef T type; };
289
+
290
+ # define BOOST_UNORDERED_CHECK_MEMBER(count, result, name, member) \
291
+ \
292
+ typedef typename boost::unordered::detail::identity<member>::type \
293
+ BOOST_PP_CAT(check, count); \
294
+ \
295
+ template <BOOST_PP_CAT(check, count) e> \
296
+ struct BOOST_PP_CAT(test, count) { \
297
+ typedef BOOST_PP_CAT(choice, result) type; \
298
+ }; \
299
+ \
300
+ template <class U> static typename \
301
+ BOOST_PP_CAT(test, count)<&U::name>::type \
302
+ test(BOOST_PP_CAT(choice, count))
303
+
304
+ # define BOOST_UNORDERED_DEFAULT_MEMBER(count, result) \
305
+ template <class U> static BOOST_PP_CAT(choice, result)::type \
306
+ test(BOOST_PP_CAT(choice, count))
307
+
308
+ # define BOOST_UNORDERED_HAS_MEMBER(name) \
309
+ struct BOOST_PP_CAT(has_, name) \
310
+ { \
311
+ struct impl { \
312
+ struct base_mixin { int name; }; \
313
+ struct base : public T, public base_mixin {}; \
314
+ \
315
+ BOOST_UNORDERED_CHECK_MEMBER(1, 1, name, int base_mixin::*); \
316
+ BOOST_UNORDERED_DEFAULT_MEMBER(2, 2); \
317
+ \
318
+ enum { value = sizeof(choice2::type) == \
319
+ sizeof(test<base>(choose())) \
320
+ }; \
321
+ }; \
322
+ \
323
+ enum { value = impl::value }; \
324
+ }
325
+
326
+ #endif
327
+
328
+ }}}
329
+
330
+ ////////////////////////////////////////////////////////////////////////////////
331
+ //
332
+ // Allocator traits
333
+ //
334
+ // First our implementation, then later light wrappers around the alternatives
335
+
336
+ #if BOOST_UNORDERED_USE_ALLOCATOR_TRAITS == 0
337
+
338
+ # include <boost/limits.hpp>
339
+ # include <boost/utility/enable_if.hpp>
340
+ # include <boost/pointer_to_other.hpp>
341
+ # if defined(BOOST_NO_SFINAE_EXPR)
342
+ # include <boost/type_traits/is_same.hpp>
343
+ # endif
344
+
345
+ # if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && \
346
+ !defined(BOOST_NO_SFINAE_EXPR)
347
+ # define BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT 1
348
+ # else
349
+ # define BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT 0
350
+ # endif
351
+
352
+ namespace boost { namespace unordered { namespace detail {
353
+
354
+ // TODO: Does this match std::allocator_traits<Alloc>::rebind_alloc<T>?
355
+ template <typename Alloc, typename T>
356
+ struct rebind_wrap
357
+ {
358
+ typedef typename Alloc::BOOST_NESTED_TEMPLATE rebind<T>::other type;
359
+ };
360
+
361
+ # if defined(BOOST_MSVC) && BOOST_MSVC <= 1400
362
+
363
+ # define BOOST_UNORDERED_DEFAULT_TYPE_TMPLT(tname) \
364
+ template <typename Tp, typename Default> \
365
+ struct default_type_ ## tname { \
366
+ \
367
+ template <typename X> \
368
+ static choice1::type test(choice1, typename X::tname* = 0); \
369
+ \
370
+ template <typename X> \
371
+ static choice2::type test(choice2, void* = 0); \
372
+ \
373
+ struct DefaultWrap { typedef Default tname; }; \
374
+ \
375
+ enum { value = (1 == sizeof(test<Tp>(choose()))) }; \
376
+ \
377
+ typedef typename boost::detail::if_true<value>:: \
378
+ BOOST_NESTED_TEMPLATE then<Tp, DefaultWrap> \
379
+ ::type::tname type; \
380
+ }
381
+
382
+ # else
383
+
384
+ template <typename T, typename T2>
385
+ struct sfinae : T2 {};
386
+
387
+ # define BOOST_UNORDERED_DEFAULT_TYPE_TMPLT(tname) \
388
+ template <typename Tp, typename Default> \
389
+ struct default_type_ ## tname { \
390
+ \
391
+ template <typename X> \
392
+ static typename boost::unordered::detail::sfinae< \
393
+ typename X::tname, choice1>::type \
394
+ test(choice1); \
395
+ \
396
+ template <typename X> \
397
+ static choice2::type test(choice2); \
398
+ \
399
+ struct DefaultWrap { typedef Default tname; }; \
400
+ \
401
+ enum { value = (1 == sizeof(test<Tp>(choose()))) }; \
402
+ \
403
+ typedef typename boost::detail::if_true<value>:: \
404
+ BOOST_NESTED_TEMPLATE then<Tp, DefaultWrap> \
405
+ ::type::tname type; \
406
+ }
407
+
408
+ # endif
409
+
410
+ # define BOOST_UNORDERED_DEFAULT_TYPE(T,tname, arg) \
411
+ typename default_type_ ## tname<T, arg>::type
412
+
413
+ BOOST_UNORDERED_DEFAULT_TYPE_TMPLT(pointer);
414
+ BOOST_UNORDERED_DEFAULT_TYPE_TMPLT(const_pointer);
415
+ BOOST_UNORDERED_DEFAULT_TYPE_TMPLT(void_pointer);
416
+ BOOST_UNORDERED_DEFAULT_TYPE_TMPLT(const_void_pointer);
417
+ BOOST_UNORDERED_DEFAULT_TYPE_TMPLT(difference_type);
418
+ BOOST_UNORDERED_DEFAULT_TYPE_TMPLT(size_type);
419
+ BOOST_UNORDERED_DEFAULT_TYPE_TMPLT(propagate_on_container_copy_assignment);
420
+ BOOST_UNORDERED_DEFAULT_TYPE_TMPLT(propagate_on_container_move_assignment);
421
+ BOOST_UNORDERED_DEFAULT_TYPE_TMPLT(propagate_on_container_swap);
422
+
423
+ # if !defined(BOOST_NO_SFINAE_EXPR)
424
+
425
+ template <typename T>
426
+ BOOST_UNORDERED_HAS_FUNCTION(
427
+ select_on_container_copy_construction, U const, (), 0
428
+ );
429
+
430
+ template <typename T>
431
+ BOOST_UNORDERED_HAS_FUNCTION(
432
+ max_size, U const, (), 0
433
+ );
434
+
435
+ # if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
436
+
437
+ template <typename T, typename ValueType, typename... Args>
438
+ BOOST_UNORDERED_HAS_FUNCTION(
439
+ construct, U, (
440
+ boost::unordered::detail::make<ValueType*>(),
441
+ boost::unordered::detail::make<Args const>()...), 2
442
+ );
443
+
444
+ # else
445
+
446
+ template <typename T, typename ValueType>
447
+ BOOST_UNORDERED_HAS_FUNCTION(
448
+ construct, U, (
449
+ boost::unordered::detail::make<ValueType*>(),
450
+ boost::unordered::detail::make<ValueType const>()), 2
451
+ );
452
+
453
+ # endif
454
+
455
+ template <typename T, typename ValueType>
456
+ BOOST_UNORDERED_HAS_FUNCTION(
457
+ destroy, U, (boost::unordered::detail::make<ValueType*>()), 1
458
+ );
459
+
460
+ # else
461
+
462
+ template <typename T>
463
+ BOOST_UNORDERED_HAS_MEMBER(select_on_container_copy_construction);
464
+
465
+ template <typename T>
466
+ BOOST_UNORDERED_HAS_MEMBER(max_size);
467
+
468
+ template <typename T, typename ValueType>
469
+ BOOST_UNORDERED_HAS_MEMBER(construct);
470
+
471
+ template <typename T, typename ValueType>
472
+ BOOST_UNORDERED_HAS_MEMBER(destroy);
473
+
474
+ # endif
475
+
476
+ template <typename Alloc>
477
+ inline Alloc call_select_on_container_copy_construction(const Alloc& rhs,
478
+ typename boost::enable_if_c<
479
+ boost::unordered::detail::
480
+ has_select_on_container_copy_construction<Alloc>::value, void*
481
+ >::type = 0)
482
+ {
483
+ return rhs.select_on_container_copy_construction();
484
+ }
485
+
486
+ template <typename Alloc>
487
+ inline Alloc call_select_on_container_copy_construction(const Alloc& rhs,
488
+ typename boost::disable_if_c<
489
+ boost::unordered::detail::
490
+ has_select_on_container_copy_construction<Alloc>::value, void*
491
+ >::type = 0)
492
+ {
493
+ return rhs;
494
+ }
495
+
496
+ template <typename SizeType, typename Alloc>
497
+ inline SizeType call_max_size(const Alloc& a,
498
+ typename boost::enable_if_c<
499
+ boost::unordered::detail::has_max_size<Alloc>::value, void*
500
+ >::type = 0)
501
+ {
502
+ return a.max_size();
503
+ }
504
+
505
+ template <typename SizeType, typename Alloc>
506
+ inline SizeType call_max_size(const Alloc&, typename boost::disable_if_c<
507
+ boost::unordered::detail::has_max_size<Alloc>::value, void*
508
+ >::type = 0)
509
+ {
510
+ return (std::numeric_limits<SizeType>::max)();
511
+ }
512
+
513
+ template <typename Alloc>
514
+ struct allocator_traits
515
+ {
516
+ typedef Alloc allocator_type;
517
+ typedef typename Alloc::value_type value_type;
518
+
519
+ typedef BOOST_UNORDERED_DEFAULT_TYPE(Alloc, pointer, value_type*)
520
+ pointer;
521
+
522
+ template <typename T>
523
+ struct pointer_to_other : boost::pointer_to_other<pointer, T> {};
524
+
525
+ typedef BOOST_UNORDERED_DEFAULT_TYPE(Alloc, const_pointer,
526
+ typename pointer_to_other<const value_type>::type)
527
+ const_pointer;
528
+
529
+ //typedef BOOST_UNORDERED_DEFAULT_TYPE(Alloc, void_pointer,
530
+ // typename pointer_to_other<void>::type)
531
+ // void_pointer;
532
+ //
533
+ //typedef BOOST_UNORDERED_DEFAULT_TYPE(Alloc, const_void_pointer,
534
+ // typename pointer_to_other<const void>::type)
535
+ // const_void_pointer;
536
+
537
+ typedef BOOST_UNORDERED_DEFAULT_TYPE(Alloc, difference_type,
538
+ std::ptrdiff_t) difference_type;
539
+
540
+ typedef BOOST_UNORDERED_DEFAULT_TYPE(Alloc, size_type, std::size_t)
541
+ size_type;
542
+
543
+ // TODO: rebind_alloc and rebind_traits
544
+
545
+ static pointer allocate(Alloc& a, size_type n)
546
+ { return a.allocate(n); }
547
+
548
+ // I never use this, so I'll just comment it out for now.
549
+ //
550
+ //static pointer allocate(Alloc& a, size_type n,
551
+ // const_void_pointer hint)
552
+ // { return DEFAULT_FUNC(allocate, pointer)(a, n, hint); }
553
+
554
+ static void deallocate(Alloc& a, pointer p, size_type n)
555
+ { a.deallocate(p, n); }
556
+
557
+ public:
558
+
559
+ # if BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT
560
+
561
+ template <typename T, typename... Args>
562
+ static typename boost::enable_if_c<
563
+ boost::unordered::detail::has_construct<Alloc, T, Args...>
564
+ ::value>::type
565
+ construct(Alloc& a, T* p, BOOST_FWD_REF(Args)... x)
566
+ {
567
+ a.construct(p, boost::forward<Args>(x)...);
568
+ }
569
+
570
+ template <typename T, typename... Args>
571
+ static typename boost::disable_if_c<
572
+ boost::unordered::detail::has_construct<Alloc, T, Args...>
573
+ ::value>::type
574
+ construct(Alloc&, T* p, BOOST_FWD_REF(Args)... x)
575
+ {
576
+ new ((void*) p) T(boost::forward<Args>(x)...);
577
+ }
578
+
579
+ template <typename T>
580
+ static typename boost::enable_if_c<
581
+ boost::unordered::detail::has_destroy<Alloc, T>::value>::type
582
+ destroy(Alloc& a, T* p)
583
+ {
584
+ a.destroy(p);
585
+ }
586
+
587
+ template <typename T>
588
+ static typename boost::disable_if_c<
589
+ boost::unordered::detail::has_destroy<Alloc, T>::value>::type
590
+ destroy(Alloc&, T* p)
591
+ {
592
+ boost::unordered::detail::destroy(p);
593
+ }
594
+
595
+ # elif !defined(BOOST_NO_SFINAE_EXPR)
596
+
597
+ template <typename T>
598
+ static typename boost::enable_if_c<
599
+ boost::unordered::detail::has_construct<Alloc, T>::value>::type
600
+ construct(Alloc& a, T* p, T const& x)
601
+ {
602
+ a.construct(p, x);
603
+ }
604
+
605
+ template <typename T>
606
+ static typename boost::disable_if_c<
607
+ boost::unordered::detail::has_construct<Alloc, T>::value>::type
608
+ construct(Alloc&, T* p, T const& x)
609
+ {
610
+ new ((void*) p) T(x);
611
+ }
612
+
613
+ template <typename T>
614
+ static typename boost::enable_if_c<
615
+ boost::unordered::detail::has_destroy<Alloc, T>::value>::type
616
+ destroy(Alloc& a, T* p)
617
+ {
618
+ a.destroy(p);
619
+ }
620
+
621
+ template <typename T>
622
+ static typename boost::disable_if_c<
623
+ boost::unordered::detail::has_destroy<Alloc, T>::value>::type
624
+ destroy(Alloc&, T* p)
625
+ {
626
+ boost::unordered::detail::destroy(p);
627
+ }
628
+
629
+ # else
630
+
631
+ // If we don't have SFINAE expressions, only call construct for the
632
+ // copy constructor for the allocator's value_type - as that's
633
+ // the only construct method that old fashioned allocators support.
634
+
635
+ template <typename T>
636
+ static void construct(Alloc& a, T* p, T const& x,
637
+ typename boost::enable_if_c<
638
+ boost::unordered::detail::has_construct<Alloc, T>::value &&
639
+ boost::is_same<T, value_type>::value,
640
+ void*>::type = 0)
641
+ {
642
+ a.construct(p, x);
643
+ }
644
+
645
+ template <typename T>
646
+ static void construct(Alloc&, T* p, T const& x,
647
+ typename boost::disable_if_c<
648
+ boost::unordered::detail::has_construct<Alloc, T>::value &&
649
+ boost::is_same<T, value_type>::value,
650
+ void*>::type = 0)
651
+ {
652
+ new ((void*) p) T(x);
653
+ }
654
+
655
+ template <typename T>
656
+ static void destroy(Alloc& a, T* p,
657
+ typename boost::enable_if_c<
658
+ boost::unordered::detail::has_destroy<Alloc, T>::value &&
659
+ boost::is_same<T, value_type>::value,
660
+ void*>::type = 0)
661
+ {
662
+ a.destroy(p);
663
+ }
664
+
665
+ template <typename T>
666
+ static void destroy(Alloc&, T* p,
667
+ typename boost::disable_if_c<
668
+ boost::unordered::detail::has_destroy<Alloc, T>::value &&
669
+ boost::is_same<T, value_type>::value,
670
+ void*>::type = 0)
671
+ {
672
+ boost::unordered::detail::destroy(p);
673
+ }
674
+
675
+ # endif
676
+
677
+ static size_type max_size(const Alloc& a)
678
+ {
679
+ return boost::unordered::detail::call_max_size<size_type>(a);
680
+ }
681
+
682
+ // Allocator propagation on construction
683
+
684
+ static Alloc select_on_container_copy_construction(Alloc const& rhs)
685
+ {
686
+ return boost::unordered::detail::
687
+ call_select_on_container_copy_construction(rhs);
688
+ }
689
+
690
+ // Allocator propagation on assignment and swap.
691
+ // Return true if lhs is modified.
692
+ typedef BOOST_UNORDERED_DEFAULT_TYPE(
693
+ Alloc, propagate_on_container_copy_assignment, false_type)
694
+ propagate_on_container_copy_assignment;
695
+ typedef BOOST_UNORDERED_DEFAULT_TYPE(
696
+ Alloc,propagate_on_container_move_assignment, false_type)
697
+ propagate_on_container_move_assignment;
698
+ typedef BOOST_UNORDERED_DEFAULT_TYPE(
699
+ Alloc,propagate_on_container_swap,false_type)
700
+ propagate_on_container_swap;
701
+ };
702
+ }}}
703
+
704
+ # undef BOOST_UNORDERED_DEFAULT_TYPE_TMPLT
705
+ # undef BOOST_UNORDERED_DEFAULT_TYPE
706
+
707
+ ////////////////////////////////////////////////////////////////////////////////
708
+ //
709
+ // std::allocator_traits
710
+
711
+ #elif BOOST_UNORDERED_USE_ALLOCATOR_TRAITS == 1
712
+
713
+ # include <memory>
714
+
715
+ # define BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT 1
716
+
717
+ namespace boost { namespace unordered { namespace detail {
718
+
719
+ template <typename Alloc>
720
+ struct allocator_traits : std::allocator_traits<Alloc> {};
721
+
722
+ template <typename Alloc, typename T>
723
+ struct rebind_wrap
724
+ {
725
+ typedef typename std::allocator_traits<Alloc>::
726
+ template rebind_alloc<T> type;
727
+ };
728
+ }}}
729
+
730
+ ////////////////////////////////////////////////////////////////////////////////
731
+ //
732
+ // boost::container::allocator_traits
733
+
734
+ #elif BOOST_UNORDERED_USE_ALLOCATOR_TRAITS == 2
735
+
736
+ # include <boost/container/allocator_traits.hpp>
737
+
738
+ # define BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT 0
739
+
740
+ namespace boost { namespace unordered { namespace detail {
741
+
742
+ template <typename Alloc>
743
+ struct allocator_traits :
744
+ boost::container::allocator_traits<Alloc> {};
745
+
746
+ template <typename Alloc, typename T>
747
+ struct rebind_wrap :
748
+ boost::container::allocator_traits<Alloc>::
749
+ template portable_rebind_alloc<T>
750
+ {};
751
+
752
+ }}}
753
+
754
+ #else
755
+
756
+ #error "Invalid BOOST_UNORDERED_USE_ALLOCATOR_TRAITS value."
757
+
758
+ #endif
759
+
760
+
761
+ namespace boost { namespace unordered { namespace detail {
762
+
763
+ ////////////////////////////////////////////////////////////////////////////
764
+ // call_construct
765
+
766
+ #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
767
+
768
+ # if BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT
769
+
770
+ template <typename Alloc, typename T, typename... Args>
771
+ inline void call_construct(Alloc& alloc, T* address,
772
+ BOOST_FWD_REF(Args)... args)
773
+ {
774
+ boost::unordered::detail::allocator_traits<Alloc>::construct(alloc,
775
+ address, boost::forward<Args>(args)...);
776
+ }
777
+
778
+ template <typename Alloc, typename T>
779
+ inline void destroy_value_impl(Alloc& alloc, T* x) {
780
+ boost::unordered::detail::allocator_traits<Alloc>::destroy(alloc, x);
781
+ }
782
+
783
+
784
+ # else
785
+
786
+ template <typename Alloc, typename T, typename... Args>
787
+ inline void call_construct(Alloc&, T* address,
788
+ BOOST_FWD_REF(Args)... args)
789
+ {
790
+ new((void*) address) T(boost::forward<Args>(args)...);
791
+ }
792
+
793
+ template <typename Alloc, typename T>
794
+ inline void destroy_value_impl(Alloc&, T* x) {
795
+ boost::unordered::detail::destroy(x);
796
+ }
797
+
798
+
799
+ # endif
800
+
801
+ #else
802
+
803
+ template <typename Alloc, typename T>
804
+ inline void destroy_value_impl(Alloc&, T* x) {
805
+ boost::unordered::detail::destroy(x);
806
+ }
807
+
808
+ #endif
809
+
810
+ ////////////////////////////////////////////////////////////////////////////
811
+ // Construct from tuple
812
+ //
813
+ // Used for piecewise construction.
814
+
815
+ #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
816
+
817
+ # define BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE(n, namespace_) \
818
+ template<typename Alloc, typename T> \
819
+ void construct_from_tuple(Alloc& alloc, T* ptr, namespace_ tuple<>) \
820
+ { \
821
+ boost::unordered::detail::call_construct(alloc, ptr); \
822
+ } \
823
+ \
824
+ BOOST_PP_REPEAT_FROM_TO(1, n, \
825
+ BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE_IMPL, namespace_)
826
+
827
+ # define BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE_IMPL(z, n, namespace_) \
828
+ template<typename Alloc, typename T, \
829
+ BOOST_PP_ENUM_PARAMS_Z(z, n, typename A)> \
830
+ void construct_from_tuple(Alloc& alloc, T* ptr, \
831
+ namespace_ tuple<BOOST_PP_ENUM_PARAMS_Z(z, n, A)> const& x) \
832
+ { \
833
+ boost::unordered::detail::call_construct(alloc, ptr, \
834
+ BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_GET_TUPLE_ARG, namespace_) \
835
+ ); \
836
+ }
837
+
838
+ # define BOOST_UNORDERED_GET_TUPLE_ARG(z, n, namespace_) \
839
+ namespace_ get<n>(x)
840
+
841
+ #elif !defined(__SUNPRO_CC)
842
+
843
+ # define BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE(n, namespace_) \
844
+ template<typename Alloc, typename T> \
845
+ void construct_from_tuple(Alloc&, T* ptr, namespace_ tuple<>) \
846
+ { \
847
+ new ((void*) ptr) T(); \
848
+ } \
849
+ \
850
+ BOOST_PP_REPEAT_FROM_TO(1, n, \
851
+ BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE_IMPL, namespace_)
852
+
853
+ # define BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE_IMPL(z, n, namespace_) \
854
+ template<typename Alloc, typename T, \
855
+ BOOST_PP_ENUM_PARAMS_Z(z, n, typename A)> \
856
+ void construct_from_tuple(Alloc&, T* ptr, \
857
+ namespace_ tuple<BOOST_PP_ENUM_PARAMS_Z(z, n, A)> const& x) \
858
+ { \
859
+ new ((void*) ptr) T( \
860
+ BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_GET_TUPLE_ARG, namespace_) \
861
+ ); \
862
+ }
863
+
864
+ # define BOOST_UNORDERED_GET_TUPLE_ARG(z, n, namespace_) \
865
+ namespace_ get<n>(x)
866
+
867
+ #else
868
+
869
+ template <int N> struct length {};
870
+
871
+ # define BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE(n, namespace_) \
872
+ template<typename Alloc, typename T> \
873
+ void construct_from_tuple_impl( \
874
+ boost::unordered::detail::length<0>, Alloc&, T* ptr, \
875
+ namespace_ tuple<>) \
876
+ { \
877
+ new ((void*) ptr) T(); \
878
+ } \
879
+ \
880
+ BOOST_PP_REPEAT_FROM_TO(1, n, \
881
+ BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE_IMPL, namespace_)
882
+
883
+ # define BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE_IMPL(z, n, namespace_) \
884
+ template<typename Alloc, typename T, \
885
+ BOOST_PP_ENUM_PARAMS_Z(z, n, typename A)> \
886
+ void construct_from_tuple_impl( \
887
+ boost::unordered::detail::length<n>, Alloc&, T* ptr, \
888
+ namespace_ tuple<BOOST_PP_ENUM_PARAMS_Z(z, n, A)> const& x) \
889
+ { \
890
+ new ((void*) ptr) T( \
891
+ BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_GET_TUPLE_ARG, namespace_) \
892
+ ); \
893
+ }
894
+
895
+ # define BOOST_UNORDERED_GET_TUPLE_ARG(z, n, namespace_) \
896
+ namespace_ get<n>(x)
897
+
898
+ #endif
899
+
900
+ BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE(10, boost::)
901
+
902
+ #if !defined(__SUNPRO_CC) && !defined(BOOST_NO_CXX11_HDR_TUPLE)
903
+ BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE(10, std::)
904
+ #endif
905
+
906
+ #undef BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE
907
+ #undef BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE_IMPL
908
+ #undef BOOST_UNORDERED_GET_TUPLE_ARG
909
+
910
+ #if defined(__SUNPRO_CC)
911
+
912
+ template <typename Alloc, typename T, typename Tuple>
913
+ void construct_from_tuple(Alloc& alloc, T* ptr, Tuple const& x)
914
+ {
915
+ construct_from_tuple_impl(
916
+ boost::unordered::detail::length<
917
+ boost::tuples::length<Tuple>::value>(),
918
+ alloc, ptr, x);
919
+ }
920
+
921
+ #endif
922
+
923
+ ////////////////////////////////////////////////////////////////////////////
924
+ // Trait to check for piecewise construction.
925
+
926
+ template <typename A0>
927
+ struct use_piecewise {
928
+ static choice1::type test(choice1,
929
+ boost::unordered::piecewise_construct_t);
930
+
931
+ static choice2::type test(choice2, ...);
932
+
933
+ enum { value = sizeof(choice1::type) ==
934
+ sizeof(test(choose(), boost::unordered::detail::make<A0>())) };
935
+ };
936
+
937
+ #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
938
+
939
+ ////////////////////////////////////////////////////////////////////////////
940
+ // Construct from variadic parameters
941
+
942
+ // For the standard pair constructor.
943
+
944
+ template <typename Alloc, typename T, typename... Args>
945
+ inline void construct_value_impl(Alloc& alloc, T* address,
946
+ BOOST_FWD_REF(Args)... args)
947
+ {
948
+ boost::unordered::detail::call_construct(alloc,
949
+ address, boost::forward<Args>(args)...);
950
+ }
951
+
952
+ // Special case for piece_construct
953
+ //
954
+ // TODO: When possible, it might be better to use std::pair's
955
+ // constructor for std::piece_construct with std::tuple.
956
+
957
+ template <typename Alloc, typename A, typename B,
958
+ typename A0, typename A1, typename A2>
959
+ inline typename enable_if<use_piecewise<A0>, void>::type
960
+ construct_value_impl(Alloc& alloc, std::pair<A, B>* address,
961
+ BOOST_FWD_REF(A0), BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2)
962
+ {
963
+ boost::unordered::detail::construct_from_tuple(alloc,
964
+ boost::addressof(address->first), boost::forward<A1>(a1));
965
+ boost::unordered::detail::construct_from_tuple(alloc,
966
+ boost::addressof(address->second), boost::forward<A2>(a2));
967
+ }
968
+
969
+ #else // BOOST_NO_CXX11_VARIADIC_TEMPLATES
970
+
971
+ ////////////////////////////////////////////////////////////////////////////////
972
+ // Construct from emplace_args
973
+
974
+ // Explicitly write out first three overloads for the sake of sane
975
+ // error messages.
976
+
977
+ template <typename Alloc, typename T, typename A0>
978
+ inline void construct_value_impl(Alloc&, T* address,
979
+ emplace_args1<A0> const& args)
980
+ {
981
+ new((void*) address) T(boost::forward<A0>(args.a0));
982
+ }
983
+
984
+ template <typename Alloc, typename T, typename A0, typename A1>
985
+ inline void construct_value_impl(Alloc&, T* address,
986
+ emplace_args2<A0, A1> const& args)
987
+ {
988
+ new((void*) address) T(
989
+ boost::forward<A0>(args.a0),
990
+ boost::forward<A1>(args.a1)
991
+ );
992
+ }
993
+
994
+ template <typename Alloc, typename T, typename A0, typename A1, typename A2>
995
+ inline void construct_value_impl(Alloc&, T* address,
996
+ emplace_args3<A0, A1, A2> const& args)
997
+ {
998
+ new((void*) address) T(
999
+ boost::forward<A0>(args.a0),
1000
+ boost::forward<A1>(args.a1),
1001
+ boost::forward<A2>(args.a2)
1002
+ );
1003
+ }
1004
+
1005
+ // Use a macro for the rest.
1006
+
1007
+ #define BOOST_UNORDERED_CONSTRUCT_IMPL(z, num_params, _) \
1008
+ template < \
1009
+ typename Alloc, typename T, \
1010
+ BOOST_PP_ENUM_PARAMS_Z(z, num_params, typename A) \
1011
+ > \
1012
+ inline void construct_value_impl(Alloc&, T* address, \
1013
+ boost::unordered::detail::BOOST_PP_CAT(emplace_args,num_params) < \
1014
+ BOOST_PP_ENUM_PARAMS_Z(z, num_params, A) \
1015
+ > const& args) \
1016
+ { \
1017
+ new((void*) address) T( \
1018
+ BOOST_PP_ENUM_##z(num_params, BOOST_UNORDERED_CALL_FORWARD, \
1019
+ args.a)); \
1020
+ }
1021
+
1022
+ BOOST_PP_REPEAT_FROM_TO(4, BOOST_UNORDERED_EMPLACE_LIMIT,
1023
+ BOOST_UNORDERED_CONSTRUCT_IMPL, _)
1024
+
1025
+ #undef BOOST_UNORDERED_CONSTRUCT_IMPL
1026
+
1027
+ // Construct with piece_construct
1028
+
1029
+ template <typename Alloc, typename A, typename B,
1030
+ typename A0, typename A1, typename A2>
1031
+ inline void construct_value_impl(Alloc& alloc, std::pair<A, B>* address,
1032
+ boost::unordered::detail::emplace_args3<A0, A1, A2> const& args,
1033
+ typename enable_if<use_piecewise<A0>, void*>::type = 0)
1034
+ {
1035
+ boost::unordered::detail::construct_from_tuple(alloc,
1036
+ boost::addressof(address->first), args.a1);
1037
+ boost::unordered::detail::construct_from_tuple(alloc,
1038
+ boost::addressof(address->second), args.a2);
1039
+ }
1040
+
1041
+ #endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES
1042
+
1043
+ }}}
1044
+
1045
+ ////////////////////////////////////////////////////////////////////////////////
1046
+ //
1047
+ // Some helper functions for allocating & constructing
1048
+
1049
+ namespace boost { namespace unordered { namespace detail {
1050
+
1051
+ ////////////////////////////////////////////////////////////////////////////
1052
+ //
1053
+ // array_constructor
1054
+ //
1055
+ // Allocate and construct an array in an exception safe manner, and
1056
+ // clean up if an exception is thrown before the container takes charge
1057
+ // of it.
1058
+
1059
+ template <typename Allocator>
1060
+ struct array_constructor
1061
+ {
1062
+ typedef boost::unordered::detail::allocator_traits<Allocator> traits;
1063
+ typedef typename traits::pointer pointer;
1064
+
1065
+ Allocator& alloc_;
1066
+ pointer ptr_;
1067
+ pointer constructed_;
1068
+ std::size_t length_;
1069
+
1070
+ array_constructor(Allocator& a)
1071
+ : alloc_(a), ptr_(), constructed_(), length_(0)
1072
+ {
1073
+ constructed_ = pointer();
1074
+ ptr_ = pointer();
1075
+ }
1076
+
1077
+ ~array_constructor() {
1078
+ if (ptr_) {
1079
+ for(pointer p = ptr_; p != constructed_; ++p)
1080
+ traits::destroy(alloc_, boost::addressof(*p));
1081
+
1082
+ traits::deallocate(alloc_, ptr_, length_);
1083
+ }
1084
+ }
1085
+
1086
+ template <typename V>
1087
+ void construct(V const& v, std::size_t l)
1088
+ {
1089
+ BOOST_ASSERT(!ptr_);
1090
+ length_ = l;
1091
+ ptr_ = traits::allocate(alloc_, length_);
1092
+ pointer end = ptr_ + static_cast<std::ptrdiff_t>(length_);
1093
+ for(constructed_ = ptr_; constructed_ != end; ++constructed_)
1094
+ traits::construct(alloc_, boost::addressof(*constructed_), v);
1095
+ }
1096
+
1097
+ pointer get() const
1098
+ {
1099
+ return ptr_;
1100
+ }
1101
+
1102
+ pointer release()
1103
+ {
1104
+ pointer p(ptr_);
1105
+ ptr_ = pointer();
1106
+ return p;
1107
+ }
1108
+
1109
+ private:
1110
+
1111
+ array_constructor(array_constructor const&);
1112
+ array_constructor& operator=(array_constructor const&);
1113
+ };
1114
+ }}}
1115
+
1116
+ #if defined(BOOST_MSVC)
1117
+ #pragma warning(pop)
1118
+ #endif
1119
+
1120
+ #endif