passenger 6.0.0 → 6.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (454) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +148 -18
  3. data/CONTRIBUTORS +6 -0
  4. data/bin/passenger-install-nginx-module +1 -1
  5. data/bin/passenger-status +15 -0
  6. data/build/misc.rb +3 -1
  7. data/build/support/vendor/cxxcodebuilder/lib/cxxcodebuilder/builder.rb +56 -3
  8. data/dev/copy_boost_headers +1 -0
  9. data/package.json +1 -1
  10. data/passenger.gemspec +1 -1
  11. data/resources/templates/error_renderer/with_details/src/bootstrap/bootstrap.css +0 -0
  12. data/resources/templates/error_renderer/with_details/src/bootstrap/bootstrap.js +0 -0
  13. data/resources/templates/error_renderer/with_details/src/bootstrap/config.json +0 -0
  14. data/resources/templates/standalone/http.erb +2 -0
  15. data/resources/templates/standalone/server.erb +1 -0
  16. data/src/agent/Core/ApplicationPool/Group/ProcessListManagement.cpp +1 -1
  17. data/src/agent/Core/ApplicationPool/Group/StateInspection.cpp +1 -0
  18. data/src/agent/Core/ApplicationPool/Options.h +10 -0
  19. data/src/agent/Core/ApplicationPool/Pool/GarbageCollection.cpp +1 -1
  20. data/src/agent/Core/ApplicationPool/Pool/StateInspection.cpp +1 -1
  21. data/src/agent/Core/Config.h +13 -1
  22. data/src/agent/Core/Controller.h +1 -0
  23. data/src/agent/Core/Controller/Config.h +4 -1
  24. data/src/agent/Core/Controller/ForwardResponse.cpp +13 -0
  25. data/src/agent/Core/Controller/InitRequest.cpp +3 -0
  26. data/src/agent/Core/Controller/InitializationAndShutdown.cpp +1 -0
  27. data/src/agent/Core/CoreMain.cpp +2 -1
  28. data/src/agent/Core/OptionParser.h +3 -0
  29. data/src/agent/Core/SpawningKit/Context.h +1 -0
  30. data/src/agent/Core/SpawningKit/Handshake/Perform.h +1 -0
  31. data/src/agent/Core/SpawningKit/Handshake/Prepare.h +1 -1
  32. data/src/agent/Core/SpawningKit/Handshake/WorkDir.h +5 -2
  33. data/src/agent/TempDirToucher/TempDirToucherMain.cpp +2 -0
  34. data/src/agent/Watchdog/Config.h +14 -1
  35. data/src/agent/Watchdog/WatchdogMain.cpp +7 -0
  36. data/src/apache2_module/ConfigGeneral/AutoGeneratedDefinitions.cpp +10 -0
  37. data/src/apache2_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.cpp +10 -0
  38. data/src/apache2_module/ConfigGeneral/AutoGeneratedSetterFuncs.cpp +30 -0
  39. data/src/apache2_module/Hooks.cpp +6 -0
  40. data/src/apache2_module/ServerConfig/AutoGeneratedManifestGeneration.cpp +20 -0
  41. data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h +24 -0
  42. data/src/cxx_supportlib/Constants.h +2 -1
  43. data/src/cxx_supportlib/LoggingKit/Config.h +2 -0
  44. data/src/cxx_supportlib/LoggingKit/Implementation.cpp +15 -9
  45. data/src/cxx_supportlib/ServerKit/HttpChunkedBodyParser.h +1 -1
  46. data/src/cxx_supportlib/SystemTools/ContainerHelpers.h +57 -2
  47. data/src/cxx_supportlib/WebSocketCommandReverseServer.h +11 -7
  48. data/src/cxx_supportlib/oxt/system_calls.cpp +10 -10
  49. data/src/cxx_supportlib/vendor-modified/boost/algorithm/string/finder.hpp +0 -4
  50. data/src/cxx_supportlib/vendor-modified/boost/asio/buffer.hpp +46 -37
  51. data/src/cxx_supportlib/vendor-modified/boost/asio/connect.hpp +16 -15
  52. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/config.hpp +45 -26
  53. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/future.hpp +33 -0
  54. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_ops.ipp +1 -1
  55. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/is_buffer_sequence.hpp +38 -14
  56. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timer_queue.hpp +2 -0
  57. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/io_context.hpp +1 -1
  58. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_until.hpp +3 -1
  59. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/use_future.hpp +0 -1
  60. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/bad_address_cast.hpp +6 -1
  61. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver.hpp +6 -4
  62. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver_results.hpp +4 -4
  63. data/src/cxx_supportlib/vendor-modified/boost/asio/packaged_task.hpp +3 -3
  64. data/src/cxx_supportlib/vendor-modified/boost/asio/read.hpp +4 -4
  65. data/src/cxx_supportlib/vendor-modified/boost/asio/read_at.hpp +4 -4
  66. data/src/cxx_supportlib/vendor-modified/boost/asio/read_until.hpp +8 -6
  67. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/context_base.hpp +17 -0
  68. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/context.ipp +50 -5
  69. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/stream.hpp +2 -1
  70. data/src/cxx_supportlib/vendor-modified/boost/asio/thread_pool.hpp +1 -1
  71. data/src/cxx_supportlib/vendor-modified/boost/asio/use_future.hpp +3 -2
  72. data/src/cxx_supportlib/vendor-modified/boost/asio/version.hpp +1 -1
  73. data/src/cxx_supportlib/vendor-modified/boost/asio/write.hpp +4 -3
  74. data/src/cxx_supportlib/vendor-modified/boost/asio/write_at.hpp +5 -3
  75. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/ops_gcc_x86_dcas.hpp +13 -12
  76. data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/inlined/mac/chrono.hpp +10 -10
  77. data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/inlined/mac/process_cpu_clocks.hpp +34 -34
  78. data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/inlined/mac/thread_clock.hpp +4 -4
  79. data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/inlined/posix/chrono.hpp +8 -8
  80. data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/inlined/posix/process_cpu_clocks.hpp +27 -27
  81. data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/inlined/posix/thread_clock.hpp +4 -4
  82. data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/system.hpp +5 -4
  83. data/src/cxx_supportlib/vendor-modified/boost/chrono/io/time_point_io.hpp +1 -1
  84. data/src/cxx_supportlib/vendor-modified/boost/circular_buffer.hpp +3 -3
  85. data/src/cxx_supportlib/vendor-modified/boost/circular_buffer/allocators.hpp +89 -0
  86. data/src/cxx_supportlib/vendor-modified/boost/circular_buffer/base.hpp +83 -74
  87. data/src/cxx_supportlib/vendor-modified/boost/circular_buffer/details.hpp +21 -33
  88. data/src/cxx_supportlib/vendor-modified/boost/circular_buffer/space_optimized.hpp +5 -5
  89. data/src/cxx_supportlib/vendor-modified/boost/concept/assert.hpp +1 -1
  90. data/src/cxx_supportlib/vendor-modified/boost/concept/detail/general.hpp +3 -3
  91. data/src/cxx_supportlib/vendor-modified/boost/concept/detail/has_constraints.hpp +3 -3
  92. data/src/cxx_supportlib/vendor-modified/boost/concept/usage.hpp +1 -1
  93. data/src/cxx_supportlib/vendor-modified/boost/concept_check.hpp +19 -19
  94. data/src/cxx_supportlib/vendor-modified/boost/config/auto_link.hpp +8 -0
  95. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/borland.hpp +5 -2
  96. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/clang.hpp +5 -1
  97. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/codegear.hpp +6 -2
  98. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/comeau.hpp +1 -1
  99. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/common_edg.hpp +4 -0
  100. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/cray.hpp +368 -52
  101. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/digitalmars.hpp +4 -1
  102. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/gcc.hpp +6 -3
  103. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/gcc_xml.hpp +3 -0
  104. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/greenhills.hpp +1 -1
  105. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/hp_acc.hpp +1 -1
  106. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/intel.hpp +6 -1
  107. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/kai.hpp +1 -1
  108. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/metrowerks.hpp +4 -1
  109. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/mpw.hpp +4 -1
  110. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/nvcc.hpp +3 -3
  111. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/pathscale.hpp +3 -0
  112. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/sunpro_cc.hpp +3 -0
  113. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/vacpp.hpp +4 -1
  114. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/visualc.hpp +9 -4
  115. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/xlcpp.hpp +4 -0
  116. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/xlcpp_zos.hpp +1 -0
  117. data/src/cxx_supportlib/vendor-modified/boost/config/detail/select_compiler_config.hpp +1 -2
  118. data/src/cxx_supportlib/vendor-modified/boost/config/detail/suffix.hpp +13 -0
  119. data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/dinkumware.hpp +2 -2
  120. data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/libcpp.hpp +14 -4
  121. data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/libstdcpp3.hpp +4 -4
  122. data/src/cxx_supportlib/vendor-modified/boost/container/adaptive_pool.hpp +262 -2
  123. data/src/cxx_supportlib/vendor-modified/boost/container/allocator.hpp +4 -3
  124. data/src/cxx_supportlib/vendor-modified/boost/container/allocator_traits.hpp +1 -1
  125. data/src/cxx_supportlib/vendor-modified/boost/container/deque.hpp +7 -0
  126. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool.hpp +22 -19
  127. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool_impl.hpp +833 -459
  128. data/src/cxx_supportlib/vendor-modified/boost/container/detail/advanced_insert_int.hpp +24 -6
  129. data/src/cxx_supportlib/vendor-modified/boost/container/detail/allocator_version_traits.hpp +2 -1
  130. data/src/cxx_supportlib/vendor-modified/boost/container/detail/compare_functors.hpp +61 -5
  131. data/src/cxx_supportlib/vendor-modified/boost/container/detail/copy_move_algo.hpp +33 -8
  132. data/src/cxx_supportlib/vendor-modified/boost/container/detail/flat_tree.hpp +132 -41
  133. data/src/cxx_supportlib/vendor-modified/boost/container/detail/iterator.hpp +16 -0
  134. data/src/cxx_supportlib/vendor-modified/boost/container/detail/math_functions.hpp +54 -0
  135. data/src/cxx_supportlib/vendor-modified/boost/container/detail/mpl.hpp +58 -0
  136. data/src/cxx_supportlib/vendor-modified/boost/container/detail/multiallocation_chain.hpp +28 -23
  137. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_alloc_holder.hpp +167 -115
  138. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pair.hpp +55 -0
  139. data/src/cxx_supportlib/vendor-modified/boost/container/detail/std_fwd.hpp +3 -0
  140. data/src/cxx_supportlib/vendor-modified/boost/container/detail/thread_mutex.hpp +181 -0
  141. data/src/cxx_supportlib/vendor-modified/boost/container/detail/tree.hpp +167 -29
  142. data/src/cxx_supportlib/vendor-modified/boost/container/detail/type_traits.hpp +2 -0
  143. data/src/cxx_supportlib/vendor-modified/boost/container/detail/variadic_templates_tools.hpp +1 -1
  144. data/src/cxx_supportlib/vendor-modified/boost/container/detail/workaround.hpp +18 -0
  145. data/src/cxx_supportlib/vendor-modified/boost/container/flat_map.hpp +389 -3
  146. data/src/cxx_supportlib/vendor-modified/boost/container/flat_set.hpp +262 -0
  147. data/src/cxx_supportlib/vendor-modified/boost/container/list.hpp +52 -8
  148. data/src/cxx_supportlib/vendor-modified/boost/container/map.hpp +364 -0
  149. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/monotonic_buffer_resource.hpp +4 -2
  150. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/resource_adaptor.hpp +1 -1
  151. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/synchronized_pool_resource.hpp +3 -2
  152. data/src/cxx_supportlib/vendor-modified/boost/container/set.hpp +286 -6
  153. data/src/cxx_supportlib/vendor-modified/boost/container/slist.hpp +56 -8
  154. data/src/cxx_supportlib/vendor-modified/boost/container/small_vector.hpp +43 -6
  155. data/src/cxx_supportlib/vendor-modified/boost/container/stable_vector.hpp +100 -31
  156. data/src/cxx_supportlib/vendor-modified/boost/container/static_vector.hpp +2 -1
  157. data/src/cxx_supportlib/vendor-modified/boost/container/string.hpp +126 -69
  158. data/src/cxx_supportlib/vendor-modified/boost/container/vector.hpp +75 -51
  159. data/src/cxx_supportlib/vendor-modified/boost/core/empty_value.hpp +136 -0
  160. data/src/cxx_supportlib/vendor-modified/boost/core/exchange.hpp +49 -0
  161. data/src/cxx_supportlib/vendor-modified/boost/core/explicit_operator_bool.hpp +9 -0
  162. data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test.hpp +101 -130
  163. data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test_trait.hpp +2 -2
  164. data/src/cxx_supportlib/vendor-modified/boost/core/noncopyable.hpp +16 -1
  165. data/src/cxx_supportlib/vendor-modified/boost/core/quick_exit.hpp +59 -0
  166. data/src/cxx_supportlib/vendor-modified/boost/core/ref.hpp +2 -1
  167. data/src/cxx_supportlib/vendor-modified/boost/core/swap.hpp +9 -2
  168. data/src/cxx_supportlib/vendor-modified/boost/core/typeinfo.hpp +26 -10
  169. data/src/cxx_supportlib/vendor-modified/boost/date_time/compiler_config.hpp +5 -0
  170. data/src/cxx_supportlib/vendor-modified/boost/date_time/posix_time/posix_time_duration.hpp +3 -3
  171. data/src/cxx_supportlib/vendor-modified/boost/date_time/time_duration.hpp +1 -1
  172. data/src/cxx_supportlib/vendor-modified/boost/detail/basic_pointerbuf.hpp +1 -1
  173. data/src/cxx_supportlib/vendor-modified/boost/detail/indirect_traits.hpp +38 -47
  174. data/src/cxx_supportlib/vendor-modified/boost/detail/lcast_precision.hpp +5 -5
  175. data/src/cxx_supportlib/vendor-modified/boost/detail/reference_content.hpp +7 -7
  176. data/src/cxx_supportlib/vendor-modified/boost/exception/exception.hpp +62 -58
  177. data/src/cxx_supportlib/vendor-modified/boost/function.hpp +1 -1
  178. data/src/cxx_supportlib/vendor-modified/boost/function/function_base.hpp +29 -29
  179. data/src/cxx_supportlib/vendor-modified/boost/function/function_template.hpp +38 -40
  180. data/src/cxx_supportlib/vendor-modified/boost/integer/common_factor_rt.hpp +4 -4
  181. data/src/cxx_supportlib/vendor-modified/boost/intrusive/avltree_algorithms.hpp +44 -44
  182. data/src/cxx_supportlib/vendor-modified/boost/intrusive/bstree_algorithms.hpp +39 -39
  183. data/src/cxx_supportlib/vendor-modified/boost/intrusive/circular_list_algorithms.hpp +15 -15
  184. data/src/cxx_supportlib/vendor-modified/boost/intrusive/circular_slist_algorithms.hpp +7 -7
  185. data/src/cxx_supportlib/vendor-modified/boost/intrusive/derivation_value_traits.hpp +1 -1
  186. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/any_node_and_algorithms.hpp +14 -14
  187. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/avltree_node.hpp +9 -9
  188. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/common_slist_algorithms.hpp +7 -7
  189. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/list_iterator.hpp +1 -1
  190. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/list_node.hpp +2 -2
  191. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/node_cloner_disposer.hpp +2 -2
  192. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/rbtree_node.hpp +6 -6
  193. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/simple_disposers.hpp +1 -1
  194. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/slist_iterator.hpp +1 -1
  195. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/slist_node.hpp +1 -1
  196. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/tree_iterator.hpp +1 -1
  197. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/tree_node.hpp +3 -3
  198. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/tree_value_compare.hpp +33 -14
  199. data/src/cxx_supportlib/vendor-modified/boost/intrusive/hashtable.hpp +12 -12
  200. data/src/cxx_supportlib/vendor-modified/boost/intrusive/linear_slist_algorithms.hpp +4 -4
  201. data/src/cxx_supportlib/vendor-modified/boost/intrusive/pointer_plus_bits.hpp +3 -0
  202. data/src/cxx_supportlib/vendor-modified/boost/intrusive/rbtree_algorithms.hpp +39 -39
  203. data/src/cxx_supportlib/vendor-modified/boost/intrusive/sgtree_algorithms.hpp +61 -61
  204. data/src/cxx_supportlib/vendor-modified/boost/intrusive/slist.hpp +4 -4
  205. data/src/cxx_supportlib/vendor-modified/boost/intrusive/splaytree_algorithms.hpp +66 -66
  206. data/src/cxx_supportlib/vendor-modified/boost/intrusive/treap_algorithms.hpp +54 -54
  207. data/src/cxx_supportlib/vendor-modified/boost/intrusive/unordered_set.hpp +6 -2
  208. data/src/cxx_supportlib/vendor-modified/boost/intrusive/unordered_set_hook.hpp +3 -3
  209. data/src/cxx_supportlib/vendor-modified/boost/iterator/advance.hpp +1 -1
  210. data/src/cxx_supportlib/vendor-modified/boost/iterator/distance.hpp +65 -0
  211. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast.hpp +1 -1
  212. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/bad_lexical_cast.hpp +1 -1
  213. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical.hpp +23 -23
  214. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical_streams.hpp +4 -4
  215. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_numeric.hpp +13 -13
  216. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/inf_nan.hpp +1 -1
  217. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/is_character.hpp +5 -4
  218. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_char_constants.hpp +1 -1
  219. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_unsigned_converters.hpp +5 -5
  220. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/widest_char.hpp +5 -2
  221. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/try_lexical_convert.hpp +18 -13
  222. data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/cregex.cpp +4 -4
  223. data/src/cxx_supportlib/vendor-modified/boost/libs/system/src/error_code.cpp +16 -5
  224. data/src/cxx_supportlib/vendor-modified/boost/libs/thread/src/future.cpp +1 -1
  225. data/src/cxx_supportlib/vendor-modified/boost/libs/thread/src/pthread/thread.cpp +14 -8
  226. data/src/cxx_supportlib/vendor-modified/boost/libs/thread/src/tss_null.cpp +2 -2
  227. data/src/cxx_supportlib/vendor-modified/boost/math/special_functions/detail/fp_traits.hpp +13 -13
  228. data/src/cxx_supportlib/vendor-modified/boost/math/special_functions/math_fwd.hpp +27 -0
  229. data/src/cxx_supportlib/vendor-modified/boost/math/tools/config.hpp +1 -1
  230. data/src/cxx_supportlib/vendor-modified/boost/move/algo/adaptive_merge.hpp +29 -6
  231. data/src/cxx_supportlib/vendor-modified/boost/move/algo/adaptive_sort.hpp +12 -3
  232. data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/adaptive_sort_merge.hpp +1 -1
  233. data/src/cxx_supportlib/vendor-modified/boost/move/algo/move.hpp +1 -1
  234. data/src/cxx_supportlib/vendor-modified/boost/move/algorithm.hpp +1 -1
  235. data/src/cxx_supportlib/vendor-modified/boost/move/core.hpp +8 -8
  236. data/src/cxx_supportlib/vendor-modified/boost/move/detail/meta_utils.hpp +2 -0
  237. data/src/cxx_supportlib/vendor-modified/boost/move/detail/type_traits.hpp +3 -3
  238. data/src/cxx_supportlib/vendor-modified/boost/mpl/assert.hpp +23 -3
  239. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/experimental_traits.hpp +9 -3
  240. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/old_optional_implementation.hpp +10 -11
  241. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_reference_spec.hpp +20 -1
  242. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_trivially_copyable_base.hpp +3 -3
  243. data/src/cxx_supportlib/vendor-modified/boost/optional/optional.hpp +211 -101
  244. data/src/cxx_supportlib/vendor-modified/boost/parameter/python.hpp +5 -6
  245. data/src/cxx_supportlib/vendor-modified/boost/pool/detail/mutex.hpp +119 -25
  246. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture.h +1 -0
  247. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/arm.h +5 -0
  248. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/ptx.h +44 -0
  249. data/src/cxx_supportlib/vendor-modified/boost/predef/compiler.h +1 -0
  250. data/src/cxx_supportlib/vendor-modified/boost/predef/compiler/compaq.h +1 -1
  251. data/src/cxx_supportlib/vendor-modified/boost/predef/compiler/nvcc.h +73 -0
  252. data/src/cxx_supportlib/vendor-modified/boost/predef/detail/endian_compat.h +3 -1
  253. data/src/cxx_supportlib/vendor-modified/boost/predef/language.h +1 -0
  254. data/src/cxx_supportlib/vendor-modified/boost/predef/language/cuda.h +52 -0
  255. data/src/cxx_supportlib/vendor-modified/boost/predef/make.h +4 -0
  256. data/src/cxx_supportlib/vendor-modified/boost/predef/os/cygwin.h +6 -1
  257. data/src/cxx_supportlib/vendor-modified/boost/predef/other/endian.h +1 -2
  258. data/src/cxx_supportlib/vendor-modified/boost/predef/version.h +1 -1
  259. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/config/config.hpp +17 -8
  260. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/stringize.hpp +4 -0
  261. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/wstringize.hpp +4 -0
  262. data/src/cxx_supportlib/vendor-modified/boost/random/detail/gray_coded_qrng.hpp +166 -0
  263. data/src/cxx_supportlib/vendor-modified/boost/random/detail/niederreiter_base2_table.hpp +513 -0
  264. data/src/cxx_supportlib/vendor-modified/boost/random/detail/qrng_base.hpp +291 -0
  265. data/src/cxx_supportlib/vendor-modified/boost/random/detail/sobol_table.hpp +4106 -0
  266. data/src/cxx_supportlib/vendor-modified/boost/random/faure.hpp +367 -0
  267. data/src/cxx_supportlib/vendor-modified/boost/random/niederreiter_base2.hpp +360 -0
  268. data/src/cxx_supportlib/vendor-modified/boost/random/sobol.hpp +237 -0
  269. data/src/cxx_supportlib/vendor-modified/boost/range/as_literal.hpp +43 -0
  270. data/src/cxx_supportlib/vendor-modified/boost/range/begin.hpp +13 -5
  271. data/src/cxx_supportlib/vendor-modified/boost/range/concepts.hpp +1 -1
  272. data/src/cxx_supportlib/vendor-modified/boost/range/detail/common.hpp +1 -3
  273. data/src/cxx_supportlib/vendor-modified/boost/range/detail/implementation_help.hpp +2 -2
  274. data/src/cxx_supportlib/vendor-modified/boost/range/distance.hpp +11 -5
  275. data/src/cxx_supportlib/vendor-modified/boost/range/end.hpp +14 -6
  276. data/src/cxx_supportlib/vendor-modified/boost/range/has_range_iterator.hpp +3 -3
  277. data/src/cxx_supportlib/vendor-modified/boost/ratio/config.hpp +6 -2
  278. data/src/cxx_supportlib/vendor-modified/boost/rational.hpp +55 -37
  279. data/src/cxx_supportlib/vendor-modified/boost/regex/concepts.hpp +3 -2
  280. data/src/cxx_supportlib/vendor-modified/boost/regex/config.hpp +11 -1
  281. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/basic_regex.hpp +7 -1
  282. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/basic_regex_creator.hpp +3 -1
  283. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/basic_regex_parser.hpp +5 -2
  284. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/fileiter.hpp +0 -3
  285. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/instances.hpp +15 -4
  286. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/match_flags.hpp +1 -2
  287. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/match_results.hpp +12 -3
  288. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher.hpp +7 -2
  289. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher_common.hpp +7 -3
  290. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher_non_recursive.hpp +6 -2
  291. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_format.hpp +0 -5
  292. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_iterator.hpp +0 -8
  293. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_raw_buffer.hpp +3 -3
  294. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_split.hpp +3 -1
  295. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_token_iterator.hpp +0 -8
  296. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_traits_defaults.hpp +12 -11
  297. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_workaround.hpp +7 -4
  298. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/u32regex_iterator.hpp +1 -9
  299. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/u32regex_token_iterator.hpp +2 -10
  300. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/w32_regex_traits.hpp +2 -0
  301. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/allocate_shared_array.hpp +60 -115
  302. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/local_counted_base.hpp +3 -3
  303. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp +2 -1
  304. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_aix.hpp +2 -1
  305. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_clang.hpp +2 -1
  306. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp +2 -1
  307. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_cw_x86.hpp +2 -1
  308. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp +2 -1
  309. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +2 -1
  310. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp +2 -1
  311. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp +2 -1
  312. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp +2 -1
  313. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_nt.hpp +2 -1
  314. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_pt.hpp +2 -1
  315. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp +2 -1
  316. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_solaris.hpp +2 -1
  317. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_spin.hpp +2 -1
  318. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_std_atomic.hpp +2 -1
  319. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_sync.hpp +2 -1
  320. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp +2 -1
  321. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_impl.hpp +3 -3
  322. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/yield_k.hpp +14 -8
  323. data/src/cxx_supportlib/vendor-modified/boost/system/config.hpp +4 -24
  324. data/src/cxx_supportlib/vendor-modified/boost/system/detail/config.hpp +57 -0
  325. data/src/cxx_supportlib/vendor-modified/boost/system/detail/generic_category.hpp +101 -0
  326. data/src/cxx_supportlib/vendor-modified/boost/system/detail/std_interoperability.hpp +141 -0
  327. data/src/cxx_supportlib/vendor-modified/boost/system/detail/system_category_posix.hpp +132 -0
  328. data/src/cxx_supportlib/vendor-modified/boost/system/error_code.hpp +775 -588
  329. data/src/cxx_supportlib/vendor-modified/boost/system/system_error.hpp +4 -4
  330. data/src/cxx_supportlib/vendor-modified/boost/thread/detail/config.hpp +6 -0
  331. data/src/cxx_supportlib/vendor-modified/boost/thread/detail/move.hpp +13 -6
  332. data/src/cxx_supportlib/vendor-modified/boost/thread/detail/nullary_function.hpp +8 -3
  333. data/src/cxx_supportlib/vendor-modified/boost/thread/detail/thread.hpp +3 -1
  334. data/src/cxx_supportlib/vendor-modified/boost/thread/detail/thread_safety.hpp +160 -0
  335. data/src/cxx_supportlib/vendor-modified/boost/thread/detail/tss_hooks.hpp +2 -2
  336. data/src/cxx_supportlib/vendor-modified/boost/thread/exceptions.hpp +3 -3
  337. data/src/cxx_supportlib/vendor-modified/boost/thread/executors/basic_thread_pool.hpp +24 -1
  338. data/src/cxx_supportlib/vendor-modified/boost/thread/future.hpp +10 -1
  339. data/src/cxx_supportlib/vendor-modified/boost/thread/lock_guard.hpp +4 -4
  340. data/src/cxx_supportlib/vendor-modified/boost/thread/lockable_traits.hpp +31 -0
  341. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/condition_variable.hpp +2 -2
  342. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/condition_variable_fwd.hpp +2 -2
  343. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/mutex.hpp +8 -53
  344. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/pthread_mutex_scoped_lock.hpp +73 -4
  345. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/recursive_mutex.hpp +6 -6
  346. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/thread_data.hpp +14 -9
  347. data/src/cxx_supportlib/vendor-modified/boost/thread/xtime.hpp +6 -6
  348. data/src/cxx_supportlib/vendor-modified/boost/throw_exception.hpp +9 -8
  349. data/src/cxx_supportlib/vendor-modified/boost/token_functions.hpp +1 -0
  350. data/src/cxx_supportlib/vendor-modified/boost/type_index/stl_type_index.hpp +21 -19
  351. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/common_arithmetic_type.hpp +3 -1
  352. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/config.hpp +9 -0
  353. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/detector.hpp +1 -1
  354. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/has_postfix_operator.hpp +55 -0
  355. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/has_prefix_operator.hpp +72 -0
  356. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_function_cxx_03.hpp +108 -0
  357. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_function_cxx_11.hpp +501 -0
  358. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_function_msvc10_fix.hpp +30 -0
  359. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_likely_lambda.hpp +2 -2
  360. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_member_function_pointer_cxx_03.hpp +117 -0
  361. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_member_function_pointer_cxx_11.hpp +557 -0
  362. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_rvalue_reference_msvc10_fix.hpp +43 -0
  363. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detected.hpp +1 -1
  364. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detected_or.hpp +1 -1
  365. data/src/cxx_supportlib/vendor-modified/boost/type_traits/enable_if.hpp +37 -0
  366. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_dereference.hpp +344 -0
  367. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_minus.hpp +5 -0
  368. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_minus_assign.hpp +5 -0
  369. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_plus_assign.hpp +5 -0
  370. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_post_decrement.hpp +21 -0
  371. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_post_increment.hpp +21 -0
  372. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_pre_decrement.hpp +21 -0
  373. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_pre_increment.hpp +22 -0
  374. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_trivial_move_assign.hpp +1 -1
  375. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_trivial_move_constructor.hpp +2 -1
  376. data/src/cxx_supportlib/vendor-modified/boost/type_traits/integral_constant.hpp +5 -15
  377. data/src/cxx_supportlib/vendor-modified/boost/type_traits/intrinsics.hpp +16 -6
  378. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_complete.hpp +3 -1
  379. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_copy_assignable.hpp +3 -4
  380. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_copy_constructible.hpp +4 -6
  381. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_detected.hpp +1 -1
  382. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_detected_convertible.hpp +1 -1
  383. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_detected_exact.hpp +1 -1
  384. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_final.hpp +1 -1
  385. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_function.hpp +4 -79
  386. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_member_function_pointer.hpp +3 -97
  387. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_noncopyable.hpp +39 -0
  388. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_nothrow_move_assignable.hpp +2 -2
  389. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_nothrow_move_constructible.hpp +2 -2
  390. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_rvalue_reference.hpp +4 -0
  391. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_virtual_base_of.hpp +104 -63
  392. data/src/cxx_supportlib/vendor-modified/boost/type_traits/make_void.hpp +1 -1
  393. data/src/cxx_supportlib/vendor-modified/boost/type_traits/nonesuch.hpp +1 -1
  394. data/src/cxx_supportlib/vendor-modified/boost/typeof/constant.hpp +26 -0
  395. data/src/cxx_supportlib/vendor-modified/boost/typeof/dmc/typeof_impl.hpp +4 -4
  396. data/src/cxx_supportlib/vendor-modified/boost/typeof/encode_decode.hpp +0 -3
  397. data/src/cxx_supportlib/vendor-modified/boost/typeof/encode_decode_params.hpp +1 -1
  398. data/src/cxx_supportlib/vendor-modified/boost/typeof/int_encoding.hpp +4 -5
  399. data/src/cxx_supportlib/vendor-modified/boost/typeof/modifiers.hpp +5 -5
  400. data/src/cxx_supportlib/vendor-modified/boost/typeof/msvc/typeof_impl.hpp +9 -9
  401. data/src/cxx_supportlib/vendor-modified/boost/typeof/native.hpp +3 -3
  402. data/src/cxx_supportlib/vendor-modified/boost/typeof/pointers_data_members.hpp +2 -2
  403. data/src/cxx_supportlib/vendor-modified/boost/typeof/register_functions_iterate.hpp +6 -6
  404. data/src/cxx_supportlib/vendor-modified/boost/typeof/register_mem_functions.hpp +1 -1
  405. data/src/cxx_supportlib/vendor-modified/boost/typeof/template_encoding.hpp +4 -4
  406. data/src/cxx_supportlib/vendor-modified/boost/typeof/template_template_param.hpp +2 -2
  407. data/src/cxx_supportlib/vendor-modified/boost/typeof/type_encoding.hpp +2 -2
  408. data/src/cxx_supportlib/vendor-modified/boost/typeof/typeof_impl.hpp +16 -16
  409. data/src/cxx_supportlib/vendor-modified/boost/typeof/vector.hpp +5 -5
  410. data/src/cxx_supportlib/vendor-modified/boost/typeof/vector100.hpp +201 -201
  411. data/src/cxx_supportlib/vendor-modified/boost/typeof/vector150.hpp +301 -301
  412. data/src/cxx_supportlib/vendor-modified/boost/typeof/vector200.hpp +401 -401
  413. data/src/cxx_supportlib/vendor-modified/boost/typeof/vector50.hpp +101 -101
  414. data/src/cxx_supportlib/vendor-modified/boost/utility/detail/minstd_rand.hpp +3 -0
  415. data/src/cxx_supportlib/vendor-modified/boost/utility/string_ref.hpp +2 -0
  416. data/src/cxx_supportlib/vendor-modified/boost/utility/string_view.hpp +26 -6
  417. data/src/cxx_supportlib/vendor-modified/boost/version.hpp +2 -2
  418. data/src/helper-scripts/prespawn +1 -0
  419. data/src/nginx_module/ConfigGeneral/AutoGeneratedDefinitions.c +40 -0
  420. data/src/nginx_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.c +26 -0
  421. data/src/nginx_module/ConfigGeneral/AutoGeneratedSetterFuncs.c +48 -0
  422. data/src/nginx_module/Configuration.c +9 -5
  423. data/src/nginx_module/ContentHandler.c +5 -1
  424. data/src/nginx_module/LocationConfig/AutoGeneratedCreateFunction.c +15 -0
  425. data/src/nginx_module/LocationConfig/AutoGeneratedHeaderSerialization.c +15 -0
  426. data/src/nginx_module/LocationConfig/AutoGeneratedManifestGeneration.c +28 -0
  427. data/src/nginx_module/LocationConfig/AutoGeneratedMergeFunction.c +6 -0
  428. data/src/nginx_module/LocationConfig/AutoGeneratedStruct.h +11 -0
  429. data/src/nginx_module/MainConfig/AutoGeneratedCreateFunction.c +11 -0
  430. data/src/nginx_module/MainConfig/AutoGeneratedManifestGeneration.c +23 -0
  431. data/src/nginx_module/MainConfig/AutoGeneratedStruct.h +8 -0
  432. data/src/nginx_module/ngx_http_passenger_module.c +2 -0
  433. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/logger.js +0 -0
  434. data/src/ruby_native_extension/extconf.rb +7 -0
  435. data/src/ruby_supportlib/phusion_passenger.rb +7 -7
  436. data/src/ruby_supportlib/phusion_passenger/admin_tools/instance_registry.rb +8 -0
  437. data/src/ruby_supportlib/phusion_passenger/apache2/config_options.rb +23 -0
  438. data/src/ruby_supportlib/phusion_passenger/constants.rb +1 -0
  439. data/src/ruby_supportlib/phusion_passenger/loader_shared_helpers.rb +1 -3
  440. data/src/ruby_supportlib/phusion_passenger/nginx/config_options.rb +37 -0
  441. data/src/ruby_supportlib/phusion_passenger/platform_info/compiler.rb +1 -1
  442. data/src/ruby_supportlib/phusion_passenger/rack/thread_handler_extension.rb +10 -0
  443. data/src/ruby_supportlib/phusion_passenger/request_handler.rb +2 -2
  444. data/src/ruby_supportlib/phusion_passenger/request_handler/thread_handler.rb +5 -0
  445. data/src/ruby_supportlib/phusion_passenger/standalone/config_options_list.rb +11 -0
  446. data/src/ruby_supportlib/phusion_passenger/standalone/start_command/builtin_engine.rb +3 -0
  447. data/src/ruby_supportlib/phusion_passenger/standalone/start_command/nginx_engine.rb +1 -1
  448. data/src/ruby_supportlib/phusion_passenger/utils/tee_input.rb +6 -0
  449. data/src/ruby_supportlib/phusion_passenger/utils/unseekable_socket.rb +15 -11
  450. metadata +48 -7
  451. data/src/cxx_supportlib/vendor-modified/boost/call_traits.hpp +0 -20
  452. data/src/cxx_supportlib/vendor-modified/boost/detail/call_traits.hpp +0 -172
  453. data/src/cxx_supportlib/vendor-modified/boost/detail/no_exceptions_support.hpp +0 -17
  454. data/src/cxx_supportlib/vendor-modified/boost/system/detail/error_code.ipp +0 -496
@@ -23,6 +23,7 @@
23
23
 
24
24
  #include <boost/intrusive/detail/iterator.hpp>
25
25
  #include <boost/move/utility_core.hpp>
26
+ #include <boost/container/detail/mpl.hpp>
26
27
 
27
28
  namespace boost {
28
29
  namespace container {
@@ -63,6 +64,21 @@ class back_emplacer
63
64
  back_emplacer& operator++(int){ return *this; }
64
65
  };
65
66
 
67
+ #ifndef BOOST_CONTAINER_NO_CXX17_CTAD
68
+
69
+ template<class InputIterator>
70
+ using it_based_non_const_first_type_t = typename dtl::remove_const<typename iterator_traits<InputIterator>::value_type::first_type>::type;
71
+
72
+ template<class InputIterator>
73
+ using it_based_const_first_type_t = const typename dtl::remove_const<typename iterator_traits<InputIterator>::value_type::first_type>::type;
74
+
75
+ template<class InputIterator>
76
+ using it_based_second_type_t = typename iterator_traits<InputIterator>::value_type::second_type;
77
+
78
+ template<class InputIterator>
79
+ using it_based_value_type_t = typename iterator_traits<InputIterator>::value_type;
80
+
81
+ #endif
66
82
 
67
83
  } //namespace container {
68
84
  } //namespace boost {
@@ -94,6 +94,34 @@ inline Integer upper_power_of_2(const Integer & A)
94
94
  return power_of_2;
95
95
  }
96
96
 
97
+ template <typename Integer, bool Loop = true>
98
+ struct upper_power_of_2_loop_ct
99
+ {
100
+
101
+ template <Integer I, Integer P>
102
+ struct apply
103
+ {
104
+ static const Integer value =
105
+ upper_power_of_2_loop_ct<Integer, (I > P*2)>::template apply<I, P*2>::value;
106
+ };
107
+ };
108
+
109
+ template <typename Integer>
110
+ struct upper_power_of_2_loop_ct<Integer, false>
111
+ {
112
+ template <Integer I, Integer P>
113
+ struct apply
114
+ {
115
+ static const Integer value = P;
116
+ };
117
+ };
118
+
119
+ template <typename Integer, Integer I>
120
+ struct upper_power_of_2_ct
121
+ {
122
+ static const Integer value = upper_power_of_2_loop_ct<Integer, (I > 1)>::template apply<I, 2>::value;
123
+ };
124
+
97
125
  //This function uses binary search to discover the
98
126
  //highest set bit of the integer
99
127
  inline std::size_t floor_log2 (std::size_t x)
@@ -114,6 +142,32 @@ inline std::size_t floor_log2 (std::size_t x)
114
142
  return log2;
115
143
  }
116
144
 
145
+ template<std::size_t I1, std::size_t I2>
146
+ struct gcd_ct
147
+ {
148
+ static const std::size_t Max = I1 > I2 ? I1 : I2;
149
+ static const std::size_t Min = I1 < I2 ? I1 : I2;
150
+ static const std::size_t value = gcd_ct<Min, Max % Min>::value;
151
+ };
152
+
153
+ template<std::size_t I1>
154
+ struct gcd_ct<I1, 0>
155
+ {
156
+ static const std::size_t value = I1;
157
+ };
158
+
159
+ template<std::size_t I1>
160
+ struct gcd_ct<0, I1>
161
+ {
162
+ static const std::size_t value = I1;
163
+ };
164
+
165
+ template<std::size_t I1, std::size_t I2>
166
+ struct lcm_ct
167
+ {
168
+ static const std::size_t value = I1 * I2 / gcd_ct<I1, I2>::value;
169
+ };
170
+
117
171
  } // namespace dtl
118
172
  } // namespace container
119
173
  } // namespace boost
@@ -61,6 +61,7 @@ using boost::move_detail::enable_if_and;
61
61
  using boost::move_detail::disable_if_and;
62
62
  using boost::move_detail::enable_if_or;
63
63
  using boost::move_detail::disable_if_or;
64
+ using boost::move_detail::remove_const;
64
65
 
65
66
  template <class FirstType>
66
67
  struct select1st
@@ -76,6 +77,63 @@ struct select1st
76
77
  { return const_cast<type&>(x.first); }
77
78
  };
78
79
 
80
+
81
+ template<typename T>
82
+ struct void_t { typedef void type; };
83
+
84
+ template <class T, class=void>
85
+ struct is_transparent_base
86
+ {
87
+ static const bool value = false;
88
+ };
89
+
90
+ template <class T>
91
+ struct is_transparent_base<T, typename void_t<typename T::is_transparent>::type>
92
+ {
93
+ static const bool value = true;
94
+ };
95
+
96
+ template <class T>
97
+ struct is_transparent
98
+ : is_transparent_base<T>
99
+ {};
100
+
101
+ template <typename C, class /*Dummy*/, typename R>
102
+ struct enable_if_transparent
103
+ : boost::move_detail::enable_if_c<dtl::is_transparent<C>::value, R>
104
+ {};
105
+
106
+ #ifndef BOOST_CONTAINER_NO_CXX17_CTAD
107
+
108
+ // void_t (void_t for C++11)
109
+ template<typename...> using variadic_void_t = void;
110
+
111
+ // Trait to detect Allocator-like types.
112
+ template<typename Allocator, typename = void>
113
+ struct is_allocator
114
+ {
115
+ static const bool value = false;
116
+ };
117
+
118
+ template <typename T>
119
+ T&& ctad_declval();
120
+
121
+ template<typename Allocator>
122
+ struct is_allocator < Allocator,
123
+ variadic_void_t< typename Allocator::value_type
124
+ , decltype(ctad_declval<Allocator&>().allocate(size_t{})) >>
125
+ {
126
+ static const bool value = true;
127
+ };
128
+
129
+ template<class T>
130
+ using require_allocator_t = typename enable_if_c<is_allocator<T>::value, T>::type;
131
+
132
+ template<class T>
133
+ using require_nonallocator_t = typename enable_if_c<!is_allocator<T>::value, T>::type;
134
+
135
+ #endif
136
+
79
137
  } //namespace dtl {
80
138
  } //namespace container {
81
139
  } //namespace boost {
@@ -171,11 +171,16 @@ class basic_multiallocation_chain
171
171
 
172
172
  std::pair<void_pointer, void_pointer> extract_data()
173
173
  {
174
- std::pair<void_pointer, void_pointer> ret
175
- (slist_impl_.begin().operator->()
176
- ,slist_impl_.last().operator->());
177
- slist_impl_.clear();
178
- return ret;
174
+ if(BOOST_LIKELY(!slist_impl_.empty())){
175
+ std::pair<void_pointer, void_pointer> ret
176
+ (slist_impl_.begin().operator->()
177
+ ,slist_impl_.last().operator->());
178
+ slist_impl_.clear();
179
+ return ret;
180
+ }
181
+ else {
182
+ return std::pair<void_pointer, void_pointer>();
183
+ }
179
184
  }
180
185
  };
181
186
 
@@ -231,46 +236,46 @@ class transform_multiallocation_chain
231
236
  return static_cast<MultiallocationChain&>
232
237
  (this->MultiallocationChain::operator=(::boost::move(static_cast<MultiallocationChain&>(other))));
233
238
  }
234
- /*
239
+
235
240
  void push_front(const pointer &mem)
236
- { holder_.push_front(mem); }
241
+ { this->MultiallocationChain::push_front(mem); }
237
242
 
238
243
  void push_back(const pointer &mem)
239
- { return holder_.push_back(mem); }
244
+ { return this->MultiallocationChain::push_back(mem); }
240
245
 
241
246
  void swap(transform_multiallocation_chain &other_chain)
242
- { holder_.swap(other_chain.holder_); }
247
+ { this->MultiallocationChain::swap(other_chain); }
243
248
 
244
249
  void splice_after(iterator after_this, transform_multiallocation_chain &x, iterator before_b, iterator before_e, size_type n)
245
- { holder_.splice_after(after_this.base(), x.holder_, before_b.base(), before_e.base(), n); }
250
+ { this->MultiallocationChain::splice_after(after_this.base(), x, before_b.base(), before_e.base(), n); }
246
251
 
247
252
  void incorporate_after(iterator after_this, pointer b, pointer before_e, size_type n)
248
- { holder_.incorporate_after(after_this.base(), b, before_e, n); }
249
- */
253
+ { this->MultiallocationChain::incorporate_after(after_this.base(), b, before_e, n); }
254
+
250
255
  pointer pop_front()
251
256
  { return cast(this->MultiallocationChain::pop_front()); }
252
- /*
257
+
253
258
  bool empty() const
254
- { return holder_.empty(); }
259
+ { return this->MultiallocationChain::empty(); }
255
260
 
256
261
  iterator before_begin()
257
- { return iterator(holder_.before_begin()); }
258
- */
262
+ { return iterator(this->MultiallocationChain::before_begin()); }
263
+
259
264
  iterator begin()
260
265
  { return iterator(this->MultiallocationChain::begin()); }
261
- /*
262
- iterator end()
263
- { return iterator(holder_.end()); }
264
266
 
265
267
  iterator last()
266
- { return iterator(holder_.last()); }
268
+ { return iterator(this->MultiallocationChain::last()); }
269
+
270
+ iterator end()
271
+ { return iterator(this->MultiallocationChain::end()); }
267
272
 
268
273
  size_type size() const
269
- { return holder_.size(); }
274
+ { return this->MultiallocationChain::size(); }
270
275
 
271
276
  void clear()
272
- { holder_.clear(); }
273
- */
277
+ { this->MultiallocationChain::clear(); }
278
+
274
279
  iterator insert_after(iterator it, pointer m)
275
280
  { return iterator(this->MultiallocationChain::insert_after(it.base(), m)); }
276
281
 
@@ -52,26 +52,49 @@ namespace boost {
52
52
  namespace container {
53
53
  namespace dtl {
54
54
 
55
- BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(value_compare)
55
+ BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(key_compare)
56
+ BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(key_equal)
57
+ BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(hasher)
56
58
  BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(predicate_type)
57
59
 
58
60
  template<class Allocator, class ICont>
59
61
  struct node_alloc_holder
62
+ : public allocator_traits<Allocator>::template
63
+ portable_rebind_alloc<typename ICont::value_type>::type //NodeAlloc
60
64
  {
61
65
  //If the intrusive container is an associative container, obtain the predicate, which will
62
- //be of type node_compare<>. If not an associative container value_compare will be a "nat" type.
66
+ //be of type node_compare<>. If not an associative container val_compare will be a "nat" type.
63
67
  typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT
64
68
  ( boost::container::dtl::
65
- , ICont, value_compare, dtl::nat) intrusive_value_compare;
69
+ , ICont, key_compare, dtl::nat) intrusive_val_compare;
66
70
  //In that case obtain the value predicate from the node predicate via predicate_type
67
- //if intrusive_value_compare is node_compare<>, nat otherwise
71
+ //if intrusive_val_compare is node_compare<>, nat otherwise
68
72
  typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT
69
73
  ( boost::container::dtl::
70
- , intrusive_value_compare
71
- , predicate_type, dtl::nat) value_compare;
74
+ , intrusive_val_compare
75
+ , predicate_type, dtl::nat) val_compare;
76
+
77
+ //If the intrusive container is a hash container, obtain the predicate, which will
78
+ //be of type node_compare<>. If not an associative container val_equal will be a "nat" type.
79
+ typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT
80
+ (boost::container::dtl::
81
+ , ICont, key_equal, dtl::nat2) intrusive_val_equal;
82
+ typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT
83
+ (boost::container::dtl::
84
+ , ICont, hasher, dtl::nat3) intrusive_val_hasher;
85
+ //In that case obtain the value predicate from the node predicate via predicate_type
86
+ //if intrusive_val_compare is node_compare<>, nat otherwise
87
+ typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT
88
+ (boost::container::dtl::
89
+ , intrusive_val_equal
90
+ , predicate_type, dtl::nat2) val_equal;
91
+ typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT
92
+ (boost::container::dtl::
93
+ , intrusive_val_hasher
94
+ , predicate_type, dtl::nat3) val_hasher;
72
95
 
73
96
  typedef allocator_traits<Allocator> allocator_traits_type;
74
- typedef typename allocator_traits_type::value_type value_type;
97
+ typedef typename allocator_traits_type::value_type val_type;
75
98
  typedef ICont intrusive_container;
76
99
  typedef typename ICont::value_type Node;
77
100
  typedef typename allocator_traits_type::template
@@ -99,51 +122,91 @@ struct node_alloc_holder
99
122
 
100
123
  //Constructors for sequence containers
101
124
  node_alloc_holder()
102
- : members_()
103
125
  {}
104
126
 
105
127
  explicit node_alloc_holder(const ValAlloc &a)
106
- : members_(a)
128
+ : NodeAlloc(a)
107
129
  {}
108
130
 
109
131
  //Constructors for associative containers
110
- node_alloc_holder(const value_compare &c, const ValAlloc &a)
111
- : members_(a, c)
132
+ node_alloc_holder(const val_compare &c, const ValAlloc &a)
133
+ : NodeAlloc(a), m_icont(typename ICont::key_compare(c))
134
+ {}
135
+
136
+ node_alloc_holder(const val_hasher &hf, const val_equal &eql, const ValAlloc &a)
137
+ : NodeAlloc(a)
138
+ , m_icont(typename ICont::bucket_traits()
139
+ , typename ICont::hasher(hf)
140
+ , typename ICont::key_equal(eql))
141
+ {}
142
+
143
+ node_alloc_holder(const val_hasher &hf, const ValAlloc &a)
144
+ : NodeAlloc(a)
145
+ , m_icont(typename ICont::bucket_traits()
146
+ , typename ICont::hasher(hf)
147
+ , typename ICont::key_equal())
148
+ {}
149
+
150
+ node_alloc_holder(const val_hasher &hf)
151
+ : m_icont(typename ICont::bucket_traits()
152
+ , typename ICont::hasher(hf)
153
+ , typename ICont::key_equal())
112
154
  {}
113
155
 
114
156
  explicit node_alloc_holder(const node_alloc_holder &x)
115
- : members_(NodeAllocTraits::select_on_container_copy_construction(x.node_alloc()))
157
+ : NodeAlloc(NodeAllocTraits::select_on_container_copy_construction(x.node_alloc()))
116
158
  {}
117
159
 
118
- node_alloc_holder(const node_alloc_holder &x, const value_compare &c)
119
- : members_(NodeAllocTraits::select_on_container_copy_construction(x.node_alloc()), c)
160
+ node_alloc_holder(const node_alloc_holder &x, const val_compare &c)
161
+ : NodeAlloc(NodeAllocTraits::select_on_container_copy_construction(x.node_alloc()))
162
+ , m_icont(typename ICont::key_compare(c))
163
+ {}
164
+
165
+ node_alloc_holder(const node_alloc_holder &x, const val_hasher &hf, const val_equal &eql)
166
+ : NodeAlloc(NodeAllocTraits::select_on_container_copy_construction(x.node_alloc()))
167
+ , m_icont( typename ICont::bucket_traits()
168
+ , typename ICont::hasher(hf)
169
+ , typename ICont::key_equal(eql))
170
+ {}
171
+
172
+ node_alloc_holder(const val_hasher &hf, const val_equal &eql)
173
+ : m_icont(typename ICont::bucket_traits()
174
+ , typename ICont::hasher(hf)
175
+ , typename ICont::key_equal(eql))
120
176
  {}
121
177
 
122
178
  explicit node_alloc_holder(BOOST_RV_REF(node_alloc_holder) x)
123
- : members_(boost::move(x.node_alloc()))
179
+ : NodeAlloc(boost::move(x.node_alloc()))
124
180
  { this->icont().swap(x.icont()); }
125
181
 
126
- explicit node_alloc_holder(const value_compare &c)
127
- : members_(c)
182
+ explicit node_alloc_holder(const val_compare &c)
183
+ : m_icont(typename ICont::key_compare(c))
128
184
  {}
129
185
 
130
186
  //helpers for move assignments
131
- explicit node_alloc_holder(BOOST_RV_REF(node_alloc_holder) x, const value_compare &c)
132
- : members_(boost::move(x.node_alloc()), c)
187
+ explicit node_alloc_holder(BOOST_RV_REF(node_alloc_holder) x, const val_compare &c)
188
+ : NodeAlloc(boost::move(x.node_alloc())), m_icont(typename ICont::key_compare(c))
133
189
  { this->icont().swap(x.icont()); }
134
190
 
191
+ explicit node_alloc_holder(BOOST_RV_REF(node_alloc_holder) x, const val_hasher &hf, const val_equal &eql)
192
+ : NodeAlloc(boost::move(x.node_alloc()))
193
+ , m_icont( typename ICont::bucket_traits()
194
+ , typename ICont::hasher(hf)
195
+ , typename ICont::key_equal(eql))
196
+ { this->icont().swap(x.icont()); }
197
+
135
198
  void copy_assign_alloc(const node_alloc_holder &x)
136
199
  {
137
200
  dtl::bool_<allocator_traits_type::propagate_on_container_copy_assignment::value> flag;
138
- dtl::assign_alloc( static_cast<NodeAlloc &>(this->members_)
139
- , static_cast<const NodeAlloc &>(x.members_), flag);
201
+ dtl::assign_alloc( static_cast<NodeAlloc &>(*this)
202
+ , static_cast<const NodeAlloc &>(x), flag);
140
203
  }
141
204
 
142
205
  void move_assign_alloc( node_alloc_holder &x)
143
206
  {
144
207
  dtl::bool_<allocator_traits_type::propagate_on_container_move_assignment::value> flag;
145
- dtl::move_alloc( static_cast<NodeAlloc &>(this->members_)
146
- , static_cast<NodeAlloc &>(x.members_), flag);
208
+ dtl::move_alloc( static_cast<NodeAlloc &>(*this)
209
+ , static_cast<NodeAlloc &>(x), flag);
147
210
  }
148
211
 
149
212
  ~node_alloc_holder()
@@ -164,14 +227,18 @@ struct node_alloc_holder
164
227
  NodePtr create_node(Args &&...args)
165
228
  {
166
229
  NodePtr p = this->allocate_one();
167
- Deallocator node_deallocator(p, this->node_alloc());
168
- allocator_traits<NodeAlloc>::construct
169
- ( this->node_alloc()
170
- , dtl::addressof(p->m_data), boost::forward<Args>(args)...);
171
- node_deallocator.release();
172
- //This does not throw
173
- typedef typename Node::hook_type hook_type;
174
- ::new(static_cast<hook_type*>(boost::movelib::to_raw_pointer(p)), boost_container_new_t()) hook_type;
230
+ BOOST_TRY{
231
+ ::new(boost::movelib::iterator_to_raw_pointer(p), boost_container_new_t()) Node;
232
+ allocator_traits<NodeAlloc>::construct
233
+ (this->node_alloc()
234
+ , p->get_real_data_ptr(), boost::forward<Args>(args)...);
235
+ }
236
+ BOOST_CATCH(...) {
237
+ p->destroy_header();
238
+ this->node_alloc().deallocate(p, 1);
239
+ BOOST_RETHROW
240
+ }
241
+ BOOST_CATCH_END
175
242
  return (p);
176
243
  }
177
244
 
@@ -182,14 +249,19 @@ struct node_alloc_holder
182
249
  NodePtr create_node(BOOST_MOVE_UREF##N)\
183
250
  {\
184
251
  NodePtr p = this->allocate_one();\
185
- Deallocator node_deallocator(p, this->node_alloc());\
186
- allocator_traits<NodeAlloc>::construct\
187
- ( this->node_alloc()\
188
- , dtl::addressof(p->m_data)\
189
- BOOST_MOVE_I##N BOOST_MOVE_FWD##N);\
190
- node_deallocator.release();\
191
- typedef typename Node::hook_type hook_type;\
192
- ::new(static_cast<hook_type*>(boost::movelib::to_raw_pointer(p)), boost_container_new_t()) hook_type;\
252
+ BOOST_TRY{\
253
+ ::new(boost::movelib::iterator_to_raw_pointer(p), boost_container_new_t()) Node;\
254
+ allocator_traits<NodeAlloc>::construct\
255
+ ( this->node_alloc()\
256
+ , p->get_real_data_ptr()\
257
+ BOOST_MOVE_I##N BOOST_MOVE_FWD##N);\
258
+ }\
259
+ BOOST_CATCH(...) {\
260
+ p->destroy_header();\
261
+ this->node_alloc().deallocate(p, 1);\
262
+ BOOST_RETHROW\
263
+ }\
264
+ BOOST_CATCH_END\
193
265
  return (p);\
194
266
  }\
195
267
  //
@@ -202,12 +274,16 @@ struct node_alloc_holder
202
274
  NodePtr create_node_from_it(const It &it)
203
275
  {
204
276
  NodePtr p = this->allocate_one();
205
- Deallocator node_deallocator(p, this->node_alloc());
206
- ::boost::container::construct_in_place(this->node_alloc(), dtl::addressof(p->m_data), it);
207
- node_deallocator.release();
208
- //This does not throw
209
- typedef typename Node::hook_type hook_type;
210
- ::new(static_cast<hook_type*>(boost::movelib::to_raw_pointer(p)), boost_container_new_t()) hook_type;
277
+ BOOST_TRY{
278
+ ::new(boost::movelib::iterator_to_raw_pointer(p), boost_container_new_t()) Node;
279
+ ::boost::container::construct_in_place(this->node_alloc(), p->get_real_data_ptr(), it);
280
+ }
281
+ BOOST_CATCH(...) {
282
+ p->destroy_header();
283
+ this->node_alloc().deallocate(p, 1);
284
+ BOOST_RETHROW
285
+ }
286
+ BOOST_CATCH_END
211
287
  return (p);
212
288
  }
213
289
 
@@ -215,22 +291,26 @@ struct node_alloc_holder
215
291
  NodePtr create_node_from_key(BOOST_FWD_REF(KeyConvertible) key)
216
292
  {
217
293
  NodePtr p = this->allocate_one();
218
- NodeAlloc &na = this->node_alloc();
219
- Deallocator node_deallocator(p, this->node_alloc());
220
- node_allocator_traits_type::construct
221
- (na, dtl::addressof(p->m_data.first), boost::forward<KeyConvertible>(key));
222
294
  BOOST_TRY{
223
- node_allocator_traits_type::construct(na, dtl::addressof(p->m_data.second));
295
+ ::new(boost::movelib::iterator_to_raw_pointer(p), boost_container_new_t()) Node;
296
+ NodeAlloc &na = this->node_alloc();
297
+ node_allocator_traits_type::construct
298
+ (na, dtl::addressof(p->get_real_data().first), boost::forward<KeyConvertible>(key));
299
+ BOOST_TRY{
300
+ node_allocator_traits_type::construct(na, dtl::addressof(p->get_real_data().second));
301
+ }
302
+ BOOST_CATCH(...){
303
+ node_allocator_traits_type::destroy(na, dtl::addressof(p->get_real_data().first));
304
+ BOOST_RETHROW;
305
+ }
306
+ BOOST_CATCH_END
224
307
  }
225
- BOOST_CATCH(...){
226
- node_allocator_traits_type::destroy(na, dtl::addressof(p->m_data.first));
227
- BOOST_RETHROW;
308
+ BOOST_CATCH(...) {
309
+ p->destroy_header();
310
+ this->node_alloc().deallocate(p, 1);
311
+ BOOST_RETHROW
228
312
  }
229
313
  BOOST_CATCH_END
230
- node_deallocator.release();
231
- //This does not throw
232
- typedef typename Node::hook_type hook_type;
233
- ::new(static_cast<hook_type*>(boost::movelib::to_raw_pointer(p)), boost_container_new_t()) hook_type;
234
314
  return (p);
235
315
  }
236
316
 
@@ -252,30 +332,32 @@ struct node_alloc_holder
252
332
  (FwdIterator beg, difference_type n, Inserter inserter)
253
333
  {
254
334
  if(n){
255
- typedef typename node_allocator_version_traits_type::multiallocation_chain multiallocation_chain;
335
+ typedef typename node_allocator_version_traits_type::multiallocation_chain multiallocation_chain_t;
256
336
 
257
337
  //Try to allocate memory in a single block
258
- typedef typename multiallocation_chain::iterator multialloc_iterator;
259
- multiallocation_chain mem;
338
+ typedef typename multiallocation_chain_t::iterator multialloc_iterator_t;
339
+ multiallocation_chain_t chain;
260
340
  NodeAlloc &nalloc = this->node_alloc();
261
- node_allocator_version_traits_type::allocate_individual(nalloc, n, mem);
262
- multialloc_iterator itbeg(mem.begin()), itlast(mem.last());
263
- mem.clear();
341
+ node_allocator_version_traits_type::allocate_individual(nalloc, n, chain);
342
+ multialloc_iterator_t itbeg = chain.begin();
343
+ multialloc_iterator_t itlast = chain.last();
344
+ chain.clear();
345
+
264
346
  Node *p = 0;
265
- BOOST_TRY{
347
+ BOOST_TRY{
266
348
  Deallocator node_deallocator(NodePtr(), nalloc);
267
349
  dtl::scoped_destructor<NodeAlloc> sdestructor(nalloc, 0);
268
- while(n--){
350
+ while(n){
351
+ --n;
269
352
  p = boost::movelib::iterator_to_raw_pointer(itbeg);
353
+ ++itbeg; //Increment iterator before overwriting pointed memory
354
+ //This does not throw
355
+ p = ::new(p, boost_container_new_t()) Node;
270
356
  node_deallocator.set(p);
271
- ++itbeg;
272
357
  //This can throw
273
- boost::container::construct_in_place(nalloc, dtl::addressof(p->m_data), beg);
358
+ boost::container::construct_in_place(nalloc, p->get_real_data_ptr(), beg);
274
359
  sdestructor.set(p);
275
360
  ++beg;
276
- //This does not throw
277
- typedef typename Node::hook_type hook_type;
278
- ::new(static_cast<hook_type*>(p), boost_container_new_t()) hook_type;
279
361
  //This can throw in some containers (predicate might throw).
280
362
  //(sdestructor will destruct the node and node_deallocator will deallocate it in case of exception)
281
363
  inserter(*p);
@@ -285,8 +367,9 @@ struct node_alloc_holder
285
367
  node_deallocator.release();
286
368
  }
287
369
  BOOST_CATCH(...){
288
- mem.incorporate_after(mem.last(), &*itbeg, &*itlast, n);
289
- node_allocator_version_traits_type::deallocate_individual(this->node_alloc(), mem);
370
+ p->destroy_header();
371
+ chain.incorporate_after(chain.last(), &*itbeg, &*itlast, n);
372
+ node_allocator_version_traits_type::deallocate_individual(this->node_alloc(), chain);
290
373
  BOOST_RETHROW
291
374
  }
292
375
  BOOST_CATCH_END
@@ -339,7 +422,7 @@ struct node_alloc_holder
339
422
  {}
340
423
 
341
424
  NodePtr operator()(const Node &other) const
342
- { return m_holder.create_node(other.m_data); }
425
+ { return m_holder.create_node(other.get_real_data()); }
343
426
 
344
427
  node_alloc_holder &m_holder;
345
428
  };
@@ -351,63 +434,32 @@ struct node_alloc_holder
351
434
  {}
352
435
 
353
436
  NodePtr operator()(Node &other)
354
- { //Use m_data instead of get_data to allow moving const key in [multi]map
355
- return m_holder.create_node(::boost::move(other.m_data));
437
+ { //Use get_real_data() instead of get_real_data to allow moving const key in [multi]map
438
+ return m_holder.create_node(::boost::move(other.get_real_data()));
356
439
  }
357
440
 
358
441
  node_alloc_holder &m_holder;
359
442
  };
360
443
 
361
- struct members_holder
362
- : public NodeAlloc
363
- {
364
- private:
365
- members_holder(const members_holder&);
366
- members_holder & operator=(const members_holder&);
367
-
368
- public:
369
- members_holder()
370
- : NodeAlloc(), m_icont()
371
- {}
372
-
373
- template<class ConvertibleToAlloc>
374
- explicit members_holder(BOOST_FWD_REF(ConvertibleToAlloc) c2alloc)
375
- : NodeAlloc(boost::forward<ConvertibleToAlloc>(c2alloc))
376
- , m_icont()
377
- {}
378
-
379
- template<class ConvertibleToAlloc>
380
- members_holder(BOOST_FWD_REF(ConvertibleToAlloc) c2alloc, const value_compare &c)
381
- : NodeAlloc(boost::forward<ConvertibleToAlloc>(c2alloc))
382
- , m_icont(typename ICont::key_compare(c))
383
- {}
384
-
385
- explicit members_holder(const value_compare &c)
386
- : NodeAlloc()
387
- , m_icont(typename ICont::key_compare(c))
388
- {}
389
-
390
- //The intrusive container
391
- ICont m_icont;
392
- };
393
-
394
444
  ICont &non_const_icont() const
395
- { return const_cast<ICont&>(this->members_.m_icont); }
445
+ { return const_cast<ICont&>(this->m_icont); }
396
446
 
397
447
  NodeAlloc &node_alloc()
398
- { return static_cast<NodeAlloc &>(this->members_); }
448
+ { return static_cast<NodeAlloc &>(*this); }
399
449
 
400
450
  const NodeAlloc &node_alloc() const
401
- { return static_cast<const NodeAlloc &>(this->members_); }
402
-
403
- members_holder members_;
451
+ { return static_cast<const NodeAlloc &>(*this); }
404
452
 
405
453
  public:
406
454
  ICont &icont()
407
- { return this->members_.m_icont; }
455
+ { return this->m_icont; }
408
456
 
409
457
  const ICont &icont() const
410
- { return this->members_.m_icont; }
458
+ { return this->m_icont; }
459
+
460
+ private:
461
+ //The intrusive container
462
+ ICont m_icont;
411
463
  };
412
464
 
413
465
  } //namespace dtl {