passenger 6.0.23 → 6.0.24

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.

Potentially problematic release.


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

Files changed (305) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +26 -1
  3. data/Rakefile +7 -3
  4. data/bin/passenger-install-apache2-module +5 -0
  5. data/bin/passenger-install-nginx-module +17 -2
  6. data/build/apache2.rb +1 -1
  7. data/build/basics.rb +10 -4
  8. data/build/cxx_tests.rb +18 -7
  9. data/build/support/cxx_dependency_map.rb +40 -6
  10. data/build/test_basics.rb +4 -12
  11. data/package.json +1 -1
  12. data/passenger.gemspec +1 -1
  13. data/src/agent/Core/ApplicationPool/Group/InitializationAndShutdown.cpp +8 -0
  14. data/src/agent/Core/ApplicationPool/Group/InternalUtils.cpp +10 -2
  15. data/src/agent/Core/ApplicationPool/Group/LifetimeAndBasics.cpp +8 -0
  16. data/src/agent/Core/ApplicationPool/Group/Miscellaneous.cpp +9 -0
  17. data/src/agent/Core/ApplicationPool/Group/OutOfBandWork.cpp +9 -0
  18. data/src/agent/Core/ApplicationPool/Group/ProcessListManagement.cpp +63 -50
  19. data/src/agent/Core/ApplicationPool/Group/SessionManagement.cpp +19 -9
  20. data/src/agent/Core/ApplicationPool/Group/SpawningAndRestarting.cpp +8 -0
  21. data/src/agent/Core/ApplicationPool/Group/StateInspection.cpp +8 -0
  22. data/src/agent/Core/ApplicationPool/Group/Verification.cpp +8 -0
  23. data/src/agent/Core/ApplicationPool/Group.h +15 -5
  24. data/src/agent/Core/ApplicationPool/Pool/AnalyticsCollection.cpp +5 -0
  25. data/src/agent/Core/ApplicationPool/Pool/GarbageCollection.cpp +5 -0
  26. data/src/agent/Core/ApplicationPool/Pool/GeneralUtils.cpp +5 -0
  27. data/src/agent/Core/ApplicationPool/Pool/GroupUtils.cpp +5 -0
  28. data/src/agent/Core/ApplicationPool/Pool/InitializationAndShutdown.cpp +5 -0
  29. data/src/agent/Core/ApplicationPool/Pool/Miscellaneous.cpp +5 -0
  30. data/src/agent/Core/ApplicationPool/Pool/ProcessUtils.cpp +5 -0
  31. data/src/agent/Core/ApplicationPool/Pool/StateInspection.cpp +11 -1
  32. data/src/agent/Core/ApplicationPool/Pool.h +0 -2
  33. data/src/agent/Core/ApplicationPool/Process.h +22 -6
  34. data/src/agent/Core/ApplicationPool/Session.h +6 -1
  35. data/src/agent/Core/Config.h +7 -3
  36. data/src/agent/Core/Controller/Config.h +1 -1
  37. data/src/agent/Core/CoreMain.cpp +10 -17
  38. data/src/agent/Core/SpawningKit/Handshake/Prepare.h +1 -53
  39. data/src/agent/Core/SpawningKit/Handshake/Session.h +3 -0
  40. data/src/agent/Core/SpawningKit/Handshake/WorkDir.h +5 -2
  41. data/src/agent/Core/SpawningKit/SmartSpawner.h +6 -2
  42. data/src/agent/Core/SpawningKit/Spawner.h +4 -0
  43. data/src/agent/Shared/Fundamentals/AbortHandler.cpp +88 -9
  44. data/src/agent/Shared/Fundamentals/AbortHandler.h +2 -0
  45. data/src/agent/Shared/Fundamentals/Initialization.cpp +9 -3
  46. data/src/agent/Shared/Fundamentals/Initialization.h +3 -3
  47. data/src/agent/SpawnEnvSetupper/SpawnEnvSetupperMain.cpp +6 -7
  48. data/src/agent/Watchdog/Config.h +1 -1
  49. data/src/agent/Watchdog/WatchdogMain.cpp +4 -7
  50. data/src/apache2_module/ConfigGeneral/ManifestGeneration.h +5 -3
  51. data/src/apache2_module/DirConfig/AutoGeneratedStruct.h +3 -0
  52. data/src/apache2_module/DirConfig/AutoGeneratedStruct.h.cxxcodebuilder +3 -0
  53. data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h +2 -1
  54. data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h.cxxcodebuilder +2 -1
  55. data/src/cxx_supportlib/Constants.h +1 -1
  56. data/src/cxx_supportlib/DataStructures/StringMap.h +0 -1
  57. data/src/cxx_supportlib/FileTools/PathManip.cpp +1 -1
  58. data/src/cxx_supportlib/SafeLibev.h +1 -3
  59. data/src/cxx_supportlib/ServerKit/Hooks.h +2 -2
  60. data/src/cxx_supportlib/ServerKit/HttpHeaderParser.h +0 -1
  61. data/src/cxx_supportlib/ServerKit/HttpServer.h +15 -10
  62. data/src/cxx_supportlib/ServerKit/Server.h +0 -6
  63. data/src/cxx_supportlib/Utils/AsyncSignalSafeUtils.h +2 -0
  64. data/src/cxx_supportlib/Utils/SpeedMeter.h +0 -3
  65. data/src/cxx_supportlib/oxt/implementation.cpp +11 -0
  66. data/src/cxx_supportlib/oxt/system_calls.cpp +10 -3
  67. data/src/cxx_supportlib/oxt/thread.hpp +1 -1
  68. data/src/cxx_supportlib/vendor-modified/boost/asio/as_tuple.hpp +35 -9
  69. data/src/cxx_supportlib/vendor-modified/boost/asio/associated_immediate_executor.hpp +3 -2
  70. data/src/cxx_supportlib/vendor-modified/boost/asio/associator.hpp +1 -1
  71. data/src/cxx_supportlib/vendor-modified/boost/asio/async_result.hpp +74 -68
  72. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_datagram_socket.hpp +11 -11
  73. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_deadline_timer.hpp +2 -2
  74. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_random_access_file.hpp +2 -2
  75. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_raw_socket.hpp +10 -10
  76. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_readable_pipe.hpp +1 -1
  77. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_seq_packet_socket.hpp +3 -3
  78. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_serial_port.hpp +2 -2
  79. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_signal_set.hpp +1 -1
  80. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket.hpp +2 -2
  81. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket_acceptor.hpp +9 -9
  82. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_stream_file.hpp +2 -2
  83. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_stream_socket.hpp +6 -6
  84. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_waitable_timer.hpp +2 -2
  85. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_writable_pipe.hpp +1 -1
  86. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_allocator.hpp +88 -22
  87. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_cancellation_slot.hpp +91 -22
  88. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_executor.hpp +105 -23
  89. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_immediate_executor.hpp +90 -23
  90. data/src/cxx_supportlib/vendor-modified/boost/asio/buffer.hpp +2 -2
  91. data/src/cxx_supportlib/vendor-modified/boost/asio/buffer_registration.hpp +1 -1
  92. data/src/cxx_supportlib/vendor-modified/boost/asio/cancel_after.hpp +303 -0
  93. data/src/cxx_supportlib/vendor-modified/boost/asio/cancel_at.hpp +296 -0
  94. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/impl/co_composed.hpp → co_composed.hpp} +208 -61
  95. data/src/cxx_supportlib/vendor-modified/boost/asio/completion_condition.hpp +49 -0
  96. data/src/cxx_supportlib/vendor-modified/boost/asio/compose.hpp +10 -201
  97. data/src/cxx_supportlib/vendor-modified/boost/asio/composed.hpp +415 -0
  98. data/src/cxx_supportlib/vendor-modified/boost/asio/connect.hpp +214 -48
  99. data/src/cxx_supportlib/vendor-modified/boost/asio/coroutine.hpp +3 -4
  100. data/src/cxx_supportlib/vendor-modified/boost/asio/default_completion_token.hpp +91 -0
  101. data/src/cxx_supportlib/vendor-modified/boost/asio/deferred.hpp +9 -5
  102. data/src/cxx_supportlib/vendor-modified/boost/asio/detached.hpp +2 -2
  103. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/buffered_stream_storage.hpp +1 -1
  104. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_message.hpp → detail/completion_message.hpp} +14 -16
  105. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_payload.hpp → detail/completion_payload.hpp} +30 -32
  106. data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_handler.hpp → detail/completion_payload_handler.hpp} +15 -13
  107. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/config.hpp +26 -32
  108. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/deadline_timer_service.hpp +5 -1
  109. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_alloc_helpers.hpp +14 -118
  110. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/descriptor_ops.ipp +36 -33
  111. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/dev_poll_reactor.ipp +1 -1
  112. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/reactive_descriptor_service.ipp +7 -5
  113. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/reactive_socket_service_base.ipp +6 -4
  114. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_ops.ipp +44 -35
  115. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_select_interrupter.ipp +1 -1
  116. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/initiation_base.hpp +64 -0
  117. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/memory.hpp +0 -11
  118. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_descriptor_service.hpp +20 -16
  119. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_send_op.hpp +0 -1
  120. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_service.hpp +4 -4
  121. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_service_base.hpp +23 -18
  122. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/recycling_allocator.hpp +9 -0
  123. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_endpoint_op.hpp +1 -1
  124. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_query_op.hpp +1 -1
  125. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/thread_info_base.hpp +11 -1
  126. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timed_cancel_op.hpp +363 -0
  127. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/wrapped_handler.hpp +29 -51
  128. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/allocator.hpp +1 -1
  129. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/blocking.hpp +1 -1
  130. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/blocking_adaptation.hpp +1 -1
  131. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/context.hpp +1 -1
  132. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/mapping.hpp +1 -1
  133. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/occupancy.hpp +1 -1
  134. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/outstanding_work.hpp +1 -1
  135. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/relationship.hpp +1 -1
  136. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/basic_channel.hpp +2 -1
  137. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/basic_concurrent_channel.hpp +2 -1
  138. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/co_composed.hpp +2 -114
  139. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_receive_op.hpp +2 -3
  140. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_send_functions.hpp +27 -19
  141. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_send_op.hpp +0 -1
  142. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_service.hpp +17 -15
  143. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/coro_promise_allocator.hpp +2 -3
  144. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/impl/channel_service.hpp +4 -2
  145. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/partial_promise.hpp +3 -5
  146. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/as_single.hpp +12 -7
  147. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/coro.hpp +1 -1
  148. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/parallel_group.hpp +38 -40
  149. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/promise.hpp +3 -3
  150. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/use_coro.hpp +5 -5
  151. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/use_promise.hpp +1 -1
  152. data/src/cxx_supportlib/vendor-modified/boost/asio/immediate.hpp +144 -0
  153. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/append.hpp +14 -7
  154. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/as_tuple.hpp +45 -14
  155. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/awaitable.hpp +3 -3
  156. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/cancel_after.hpp +270 -0
  157. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/cancel_at.hpp +270 -0
  158. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/co_spawn.hpp +8 -0
  159. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/connect.hpp +60 -166
  160. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/consign.hpp +14 -7
  161. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/detached.hpp +2 -2
  162. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/prepend.hpp +14 -7
  163. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read.hpp +26 -177
  164. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_at.hpp +16 -82
  165. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_until.hpp +13 -286
  166. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/redirect_error.hpp +55 -18
  167. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/spawn.hpp +1 -1
  168. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/write.hpp +26 -185
  169. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/write_at.hpp +16 -87
  170. data/src/cxx_supportlib/vendor-modified/boost/asio/io_context_strand.hpp +5 -5
  171. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver.hpp +6 -6
  172. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/detail/socket_option.hpp +1 -1
  173. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address_v6.ipp +1 -1
  174. data/src/cxx_supportlib/vendor-modified/boost/asio/placeholders.hpp +12 -6
  175. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/basic_descriptor.hpp +1 -1
  176. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/basic_stream_descriptor.hpp +2 -2
  177. data/src/cxx_supportlib/vendor-modified/boost/asio/read.hpp +127 -28
  178. data/src/cxx_supportlib/vendor-modified/boost/asio/read_at.hpp +70 -20
  179. data/src/cxx_supportlib/vendor-modified/boost/asio/read_until.hpp +114 -36
  180. data/src/cxx_supportlib/vendor-modified/boost/asio/redirect_error.hpp +43 -3
  181. data/src/cxx_supportlib/vendor-modified/boost/asio/registered_buffer.hpp +2 -2
  182. data/src/cxx_supportlib/vendor-modified/boost/asio/spawn.hpp +0 -1
  183. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/impl/openssl_init.ipp +2 -2
  184. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/context.ipp +10 -7
  185. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/stream.hpp +5 -5
  186. data/src/cxx_supportlib/vendor-modified/boost/asio/this_coro.hpp +2 -2
  187. data/src/cxx_supportlib/vendor-modified/boost/asio/use_awaitable.hpp +2 -2
  188. data/src/cxx_supportlib/vendor-modified/boost/asio/use_future.hpp +1 -1
  189. data/src/cxx_supportlib/vendor-modified/boost/asio/uses_executor.hpp +1 -1
  190. data/src/cxx_supportlib/vendor-modified/boost/asio/version.hpp +1 -1
  191. data/src/cxx_supportlib/vendor-modified/boost/asio/write.hpp +147 -35
  192. data/src/cxx_supportlib/vendor-modified/boost/asio/write_at.hpp +74 -22
  193. data/src/cxx_supportlib/vendor-modified/boost/asio.hpp +6 -0
  194. data/src/cxx_supportlib/vendor-modified/boost/assert/source_location.hpp +4 -1
  195. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/futex.hpp +42 -11
  196. data/src/cxx_supportlib/vendor-modified/boost/bind/bind.hpp +15 -37
  197. data/src/cxx_supportlib/vendor-modified/boost/container/adaptive_pool.hpp +8 -8
  198. data/src/cxx_supportlib/vendor-modified/boost/container/allocator.hpp +1 -1
  199. data/src/cxx_supportlib/vendor-modified/boost/container/allocator_traits.hpp +151 -10
  200. data/src/cxx_supportlib/vendor-modified/boost/container/container_fwd.hpp +11 -9
  201. data/src/cxx_supportlib/vendor-modified/boost/container/deque.hpp +611 -102
  202. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool.hpp +1 -1
  203. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool_impl.hpp +47 -47
  204. data/src/cxx_supportlib/vendor-modified/boost/container/detail/advanced_insert_int.hpp +25 -24
  205. data/src/cxx_supportlib/vendor-modified/boost/container/detail/allocation_type.hpp +7 -7
  206. data/src/cxx_supportlib/vendor-modified/boost/container/detail/block_list.hpp +2 -2
  207. data/src/cxx_supportlib/vendor-modified/boost/container/detail/block_slist.hpp +2 -2
  208. data/src/cxx_supportlib/vendor-modified/boost/container/detail/construct_in_place.hpp +35 -1
  209. data/src/cxx_supportlib/vendor-modified/boost/container/detail/copy_move_algo.hpp +14 -14
  210. data/src/cxx_supportlib/vendor-modified/boost/container/detail/dispatch_uses_allocator.hpp +1 -1
  211. data/src/cxx_supportlib/vendor-modified/boost/container/detail/flat_tree.hpp +55 -23
  212. data/src/cxx_supportlib/vendor-modified/boost/container/detail/function_detector.hpp +1 -1
  213. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_container.hpp +2 -2
  214. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_contiguous_container.hpp +1 -1
  215. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_pair.hpp +4 -4
  216. data/src/cxx_supportlib/vendor-modified/boost/container/detail/iterators.hpp +8 -8
  217. data/src/cxx_supportlib/vendor-modified/boost/container/detail/math_functions.hpp +9 -9
  218. data/src/cxx_supportlib/vendor-modified/boost/container/detail/mpl.hpp +4 -4
  219. data/src/cxx_supportlib/vendor-modified/boost/container/detail/multiallocation_chain.hpp +96 -10
  220. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_alloc_holder.hpp +19 -4
  221. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_pool.hpp +1 -1
  222. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pair.hpp +17 -17
  223. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_common.hpp +1 -1
  224. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_common_alloc.hpp +2 -2
  225. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_resource.hpp +4 -4
  226. data/src/cxx_supportlib/vendor-modified/boost/container/detail/tree.hpp +86 -52
  227. data/src/cxx_supportlib/vendor-modified/boost/container/detail/version_type.hpp +4 -4
  228. data/src/cxx_supportlib/vendor-modified/boost/container/detail/workaround.hpp +12 -0
  229. data/src/cxx_supportlib/vendor-modified/boost/container/devector.hpp +145 -65
  230. data/src/cxx_supportlib/vendor-modified/boost/container/flat_map.hpp +105 -22
  231. data/src/cxx_supportlib/vendor-modified/boost/container/flat_set.hpp +2 -2
  232. data/src/cxx_supportlib/vendor-modified/boost/container/list.hpp +30 -22
  233. data/src/cxx_supportlib/vendor-modified/boost/container/map.hpp +19 -2
  234. data/src/cxx_supportlib/vendor-modified/boost/container/new_allocator.hpp +1 -1
  235. data/src/cxx_supportlib/vendor-modified/boost/container/node_allocator.hpp +15 -8
  236. data/src/cxx_supportlib/vendor-modified/boost/container/node_handle.hpp +6 -5
  237. data/src/cxx_supportlib/vendor-modified/boost/container/options.hpp +15 -15
  238. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/memory_resource.hpp +1 -1
  239. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/monotonic_buffer_resource.hpp +1 -1
  240. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/resource_adaptor.hpp +3 -3
  241. data/src/cxx_supportlib/vendor-modified/boost/container/scoped_allocator.hpp +1 -1
  242. data/src/cxx_supportlib/vendor-modified/boost/container/set.hpp +2 -2
  243. data/src/cxx_supportlib/vendor-modified/boost/container/slist.hpp +31 -24
  244. data/src/cxx_supportlib/vendor-modified/boost/container/small_vector.hpp +45 -43
  245. data/src/cxx_supportlib/vendor-modified/boost/container/stable_vector.hpp +45 -33
  246. data/src/cxx_supportlib/vendor-modified/boost/container/static_vector.hpp +5 -7
  247. data/src/cxx_supportlib/vendor-modified/boost/container/string.hpp +55 -47
  248. data/src/cxx_supportlib/vendor-modified/boost/container/uses_allocator.hpp +3 -3
  249. data/src/cxx_supportlib/vendor-modified/boost/container/vector.hpp +222 -73
  250. data/src/cxx_supportlib/vendor-modified/boost/core/detail/minstd_rand.hpp +58 -0
  251. data/src/cxx_supportlib/vendor-modified/boost/core/detail/string_view.hpp +13 -13
  252. data/src/cxx_supportlib/vendor-modified/boost/core/empty_value.hpp +53 -5
  253. data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test.hpp +1 -0
  254. data/src/cxx_supportlib/vendor-modified/boost/core/pointer_in_range.hpp +49 -0
  255. data/src/cxx_supportlib/vendor-modified/boost/core/span.hpp +2 -0
  256. data/src/cxx_supportlib/vendor-modified/boost/core/type_name.hpp +7 -2
  257. data/src/cxx_supportlib/vendor-modified/boost/function/function_base.hpp +22 -34
  258. data/src/cxx_supportlib/vendor-modified/boost/function/function_template.hpp +141 -38
  259. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/algorithm.hpp +8 -8
  260. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hash.hpp +1 -1
  261. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hook_traits.hpp +8 -6
  262. data/src/cxx_supportlib/vendor-modified/boost/intrusive/pointer_traits.hpp +18 -18
  263. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical_streams.hpp +22 -17
  264. data/src/cxx_supportlib/vendor-modified/boost/libs/random/src/random_device.cpp +3 -1
  265. data/src/cxx_supportlib/vendor-modified/boost/move/detail/config_begin.hpp +0 -1
  266. data/src/cxx_supportlib/vendor-modified/boost/move/detail/launder.hpp +53 -0
  267. data/src/cxx_supportlib/vendor-modified/boost/move/detail/type_traits.hpp +9 -1
  268. data/src/cxx_supportlib/vendor-modified/boost/move/detail/workaround.hpp +6 -1
  269. data/src/cxx_supportlib/vendor-modified/boost/mp11/version.hpp +1 -1
  270. data/src/cxx_supportlib/vendor-modified/boost/mpl/aux_/integral_wrapper.hpp +2 -1
  271. data/src/cxx_supportlib/vendor-modified/boost/predef/version.h +1 -1
  272. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/requires_cxx11.hpp +1 -1
  273. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_has_gcc_intrinsics.hpp +4 -1
  274. data/src/cxx_supportlib/vendor-modified/boost/system/detail/generic_category_message.hpp +13 -1
  275. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map.hpp +13 -1
  276. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map_fwd.hpp +15 -0
  277. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_set.hpp +13 -1
  278. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_set_fwd.hpp +15 -0
  279. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/fca.hpp +22 -6
  280. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/concurrent_table.hpp +38 -10
  281. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/core.hpp +111 -2
  282. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/cumulative_stats.hpp +177 -0
  283. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/table.hpp +11 -1
  284. data/src/cxx_supportlib/vendor-modified/boost/unordered/hash_traits.hpp +33 -7
  285. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map.hpp +12 -0
  286. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map_fwd.hpp +15 -0
  287. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set.hpp +12 -0
  288. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set_fwd.hpp +14 -0
  289. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_map_fwd.hpp +19 -0
  290. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map.hpp +12 -0
  291. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map_fwd.hpp +15 -0
  292. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set.hpp +12 -0
  293. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set_fwd.hpp +14 -0
  294. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_set_fwd.hpp +17 -0
  295. data/src/cxx_supportlib/vendor-modified/boost/utility/detail/minstd_rand.hpp +1 -43
  296. data/src/cxx_supportlib/vendor-modified/boost/version.hpp +2 -2
  297. data/src/ruby_supportlib/phusion_passenger/config/compile_nginx_engine_command.rb +6 -2
  298. data/src/ruby_supportlib/phusion_passenger/config/install_standalone_runtime_command.rb +10 -0
  299. data/src/ruby_supportlib/phusion_passenger/config/nginx_engine_compiler.rb +12 -4
  300. data/src/ruby_supportlib/phusion_passenger/platform_info/compiler.rb +32 -5
  301. data/src/ruby_supportlib/phusion_passenger/standalone/start_command.rb +0 -4
  302. data/src/ruby_supportlib/phusion_passenger/utils/json.rb +5 -1
  303. data/src/ruby_supportlib/phusion_passenger/utils.rb +5 -15
  304. data/src/ruby_supportlib/phusion_passenger.rb +5 -5
  305. metadata +21 -8
@@ -26,7 +26,6 @@
26
26
 
27
27
  #include <boost/move/utility_core.hpp>
28
28
 
29
- #include <boost/container/detail/pair.hpp>
30
29
  #include <boost/container/vector.hpp>
31
30
  #include <boost/container/allocator_traits.hpp>
32
31
 
@@ -43,11 +42,11 @@
43
42
 
44
43
  #include <boost/intrusive/detail/minimal_pair_header.hpp> //pair
45
44
 
46
- #include <boost/move/make_unique.hpp>
47
45
  #include <boost/move/iterator.hpp>
48
46
  #include <boost/move/adl_move_swap.hpp>
49
47
  #include <boost/move/detail/iterator_to_raw_pointer.hpp>
50
48
  #include <boost/move/detail/force_ptr.hpp>
49
+ #include <boost/move/detail/launder.hpp>
51
50
  #include <boost/move/algo/adaptive_sort.hpp>
52
51
  #include <boost/move/algo/detail/pdqsort.hpp>
53
52
 
@@ -583,7 +582,7 @@ class flat_tree
583
582
  (boost::container::dtl::, container_type
584
583
  ,stored_allocator_type, allocator_type) stored_allocator_type;
585
584
 
586
- static const bool has_stored_allocator_type =
585
+ BOOST_STATIC_CONSTEXPR bool has_stored_allocator_type =
587
586
  BOOST_INTRUSIVE_HAS_TYPE(boost::container::dtl::, container_type, stored_allocator_type);
588
587
 
589
588
  private:
@@ -955,6 +954,7 @@ class flat_tree
955
954
  template <class InIt>
956
955
  void insert_equal(ordered_range_t, InIt first, InIt last)
957
956
  {
957
+ BOOST_ASSERT((is_sorted)(first, last, this->priv_value_comp()));
958
958
  const bool value = boost::container::dtl::
959
959
  has_member_function_callable_with_merge_unique<container_type, InIt, InIt, value_compare>::value;
960
960
  (flat_tree_merge_equal)(this->m_data.m_seq, first, last, this->priv_value_comp(), dtl::bool_<value>());
@@ -963,6 +963,7 @@ class flat_tree
963
963
  template <class InIt>
964
964
  void insert_unique(ordered_unique_range_t, InIt first, InIt last)
965
965
  {
966
+ BOOST_ASSERT((is_sorted_and_unique)(this->m_data.m_seq.cbegin(), this->m_data.m_seq.cend(), this->priv_value_comp()));
966
967
  const bool value = boost::container::dtl::
967
968
  has_member_function_callable_with_merge_unique<container_type, InIt, InIt, value_compare>::value;
968
969
  (flat_tree_merge_unique)(this->m_data.m_seq, first, last, this->priv_value_comp(), dtl::bool_<value>());
@@ -975,8 +976,8 @@ class flat_tree
975
976
  {
976
977
  typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type v;
977
978
  get_stored_allocator_noconst_return_t a = this->get_stored_allocator();
978
- stored_allocator_traits::construct(a, move_detail::force_ptr<value_type *>(&v), ::boost::forward<Args>(args)... );
979
- value_type *pval = move_detail::force_ptr<value_type *>(&v);
979
+ stored_allocator_traits::construct(a, (value_type *)(&v), ::boost::forward<Args>(args)... );
980
+ value_type *pval = move_detail::launder_cast<value_type *>(&v);
980
981
  value_destructor<stored_allocator_type, value_type> d(a, *pval);
981
982
  return this->insert_unique(::boost::move(*pval));
982
983
  }
@@ -987,8 +988,8 @@ class flat_tree
987
988
  //hint checked in insert_unique
988
989
  typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type v;
989
990
  get_stored_allocator_noconst_return_t a = this->get_stored_allocator();
990
- stored_allocator_traits::construct(a, move_detail::force_ptr<value_type *>(&v), ::boost::forward<Args>(args)... );
991
- value_type *pval = move_detail::force_ptr<value_type *>(&v);
991
+ stored_allocator_traits::construct(a, (value_type*)(&v), ::boost::forward<Args>(args)... );
992
+ value_type *pval = move_detail::launder_cast<value_type *>(&v);
992
993
  value_destructor<stored_allocator_type, value_type> d(a, *pval);
993
994
  return this->insert_unique(hint, ::boost::move(*pval));
994
995
  }
@@ -998,8 +999,8 @@ class flat_tree
998
999
  {
999
1000
  typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type v;
1000
1001
  get_stored_allocator_noconst_return_t a = this->get_stored_allocator();
1001
- stored_allocator_traits::construct(a, move_detail::force_ptr<value_type *>(&v), ::boost::forward<Args>(args)... );
1002
- value_type *pval = move_detail::force_ptr<value_type *>(&v);
1002
+ stored_allocator_traits::construct(a, (value_type*)(&v), ::boost::forward<Args>(args)... );
1003
+ value_type *pval = move_detail::launder_cast<value_type *>(&v);
1003
1004
  value_destructor<stored_allocator_type, value_type> d(a, *pval);
1004
1005
  return this->insert_equal(::boost::move(*pval));
1005
1006
  }
@@ -1010,8 +1011,8 @@ class flat_tree
1010
1011
  //hint checked in insert_equal
1011
1012
  typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type v;
1012
1013
  get_stored_allocator_noconst_return_t a = this->get_stored_allocator();
1013
- stored_allocator_traits::construct(a, move_detail::force_ptr<value_type *>(&v), ::boost::forward<Args>(args)... );
1014
- value_type *pval = move_detail::force_ptr<value_type *>(&v);
1014
+ stored_allocator_traits::construct(a, (value_type*)(&v), ::boost::forward<Args>(args)... );
1015
+ value_type *pval = move_detail::launder_cast<value_type *>(&v);
1015
1016
  value_destructor<stored_allocator_type, value_type> d(a, *pval);
1016
1017
  return this->insert_equal(hint, ::boost::move(*pval));
1017
1018
  }
@@ -1044,8 +1045,8 @@ class flat_tree
1044
1045
  {\
1045
1046
  typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type v;\
1046
1047
  get_stored_allocator_noconst_return_t a = this->get_stored_allocator();\
1047
- stored_allocator_traits::construct(a, move_detail::force_ptr<value_type *>(&v) BOOST_MOVE_I##N BOOST_MOVE_FWD##N);\
1048
- value_type *pval = move_detail::force_ptr<value_type *>(&v);\
1048
+ stored_allocator_traits::construct(a, (value_type *)(&v) BOOST_MOVE_I##N BOOST_MOVE_FWD##N);\
1049
+ value_type *pval = move_detail::launder_cast<value_type *>(&v);\
1049
1050
  value_destructor<stored_allocator_type, value_type> d(a, *pval);\
1050
1051
  return this->insert_unique(::boost::move(*pval));\
1051
1052
  }\
@@ -1055,8 +1056,8 @@ class flat_tree
1055
1056
  {\
1056
1057
  typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type v;\
1057
1058
  get_stored_allocator_noconst_return_t a = this->get_stored_allocator();\
1058
- stored_allocator_traits::construct(a, move_detail::force_ptr<value_type *>(&v) BOOST_MOVE_I##N BOOST_MOVE_FWD##N);\
1059
- value_type *pval = move_detail::force_ptr<value_type *>(&v);\
1059
+ stored_allocator_traits::construct(a, (value_type *)(&v) BOOST_MOVE_I##N BOOST_MOVE_FWD##N);\
1060
+ value_type *pval = move_detail::launder_cast<value_type *>(&v);\
1060
1061
  value_destructor<stored_allocator_type, value_type> d(a, *pval);\
1061
1062
  return this->insert_unique(hint, ::boost::move(*pval));\
1062
1063
  }\
@@ -1066,8 +1067,8 @@ class flat_tree
1066
1067
  {\
1067
1068
  typename dtl::aligned_storage<sizeof(value_type), dtl::alignment_of<value_type>::value>::type v;\
1068
1069
  get_stored_allocator_noconst_return_t a = this->get_stored_allocator();\
1069
- stored_allocator_traits::construct(a, move_detail::force_ptr<value_type *>(&v) BOOST_MOVE_I##N BOOST_MOVE_FWD##N);\
1070
- value_type *pval = move_detail::force_ptr<value_type *>(&v);\
1070
+ stored_allocator_traits::construct(a, (value_type *)(&v) BOOST_MOVE_I##N BOOST_MOVE_FWD##N);\
1071
+ value_type *pval = move_detail::launder_cast<value_type *>(&v);\
1071
1072
  value_destructor<stored_allocator_type, value_type> d(a, *pval);\
1072
1073
  return this->insert_equal(::boost::move(*pval));\
1073
1074
  }\
@@ -1077,8 +1078,8 @@ class flat_tree
1077
1078
  {\
1078
1079
  typename dtl::aligned_storage <sizeof(value_type), dtl::alignment_of<value_type>::value>::type v;\
1079
1080
  get_stored_allocator_noconst_return_t a = this->get_stored_allocator();\
1080
- stored_allocator_traits::construct(a, move_detail::force_ptr<value_type *>(&v) BOOST_MOVE_I##N BOOST_MOVE_FWD##N);\
1081
- value_type *pval = move_detail::force_ptr<value_type *>(&v);\
1081
+ stored_allocator_traits::construct(a, (value_type *)(&v) BOOST_MOVE_I##N BOOST_MOVE_FWD##N);\
1082
+ value_type *pval = move_detail::launder_cast<value_type *>(&v);\
1082
1083
  value_destructor<stored_allocator_type, value_type> d(a, *pval);\
1083
1084
  return this->insert_equal(hint, ::boost::move(*pval));\
1084
1085
  }\
@@ -1126,9 +1127,6 @@ class flat_tree
1126
1127
  return ret;
1127
1128
  }
1128
1129
 
1129
- inline iterator erase(const_iterator position)
1130
- { return this->m_data.m_seq.erase(position); }
1131
-
1132
1130
  size_type erase(const key_type& k)
1133
1131
  {
1134
1132
  std::pair<iterator,iterator > itp = this->equal_range(k);
@@ -1148,6 +1146,40 @@ class flat_tree
1148
1146
  return ret;
1149
1147
  }
1150
1148
 
1149
+ template <class K>
1150
+ inline typename dtl::enable_if_c<
1151
+ dtl::is_transparent<key_compare>::value && //transparent
1152
+ !dtl::is_convertible<K, iterator>::value && //not convertible to iterator
1153
+ !dtl::is_convertible<K, const_iterator>::value //not convertible to const_iterator
1154
+ , size_type>::type
1155
+ erase(const K& k)
1156
+ {
1157
+ std::pair<iterator, iterator > itp = this->equal_range(k);
1158
+ size_type ret = static_cast<size_type>(itp.second - itp.first);
1159
+ if (ret) {
1160
+ this->m_data.m_seq.erase(itp.first, itp.second);
1161
+ }
1162
+ return ret;
1163
+ }
1164
+
1165
+ template <class K>
1166
+ inline typename dtl::enable_if_c<
1167
+ dtl::is_transparent<key_compare>::value && //transparent
1168
+ !dtl::is_convertible<K, iterator>::value && //not convertible to iterator
1169
+ !dtl::is_convertible<K, const_iterator>::value //not convertible to const_iterator
1170
+ , size_type>::type
1171
+ erase_unique(const K& k)
1172
+ {
1173
+ const_iterator i = static_cast<const flat_tree&>(*this).find(k);
1174
+ size_type ret = static_cast<size_type>(i != this->cend());
1175
+ if (ret)
1176
+ this->erase(i);
1177
+ return ret;
1178
+ }
1179
+
1180
+ inline iterator erase(const_iterator position)
1181
+ { return this->m_data.m_seq.erase(position); }
1182
+
1151
1183
  inline iterator erase(const_iterator first, const_iterator last)
1152
1184
  { return this->m_data.m_seq.erase(first, last); }
1153
1185
 
@@ -1700,7 +1732,7 @@ struct has_trivial_destructor_after_move<boost::container::dtl::flat_tree<T, Key
1700
1732
  typedef boost::container::dtl::flat_tree<T, KeyOfValue, Compare, AllocatorOrContainer> flat_tree;
1701
1733
  typedef typename flat_tree::container_type container_type;
1702
1734
  typedef typename flat_tree::key_compare key_compare;
1703
- static const bool value = ::boost::has_trivial_destructor_after_move<container_type>::value &&
1735
+ BOOST_STATIC_CONSTEXPR bool value = ::boost::has_trivial_destructor_after_move<container_type>::value &&
1704
1736
  ::boost::has_trivial_destructor_after_move<key_compare>::value;
1705
1737
  };
1706
1738
 
@@ -80,7 +80,7 @@ namespace function_detector {
80
80
  template <class U> \
81
81
  static NotFoundType Test( ... ); \
82
82
  public : \
83
- static const int check = NotFound + (sizeof(Test<T>(0, 0)) - sizeof(NotFoundType));\
83
+ BOOST_STATIC_CONSTEXPR int check = NotFound + (sizeof(Test<T>(0, 0)) - sizeof(NotFoundType));\
84
84
  };\
85
85
  }}} //namespace boost::container::function_detector {
86
86
 
@@ -51,7 +51,7 @@ namespace dtl {
51
51
  template <class Container>
52
52
  struct is_container
53
53
  {
54
- static const bool value =
54
+ BOOST_STATIC_CONSTEXPR bool value =
55
55
  boost::container::is_container_detail::
56
56
  has_member_function_callable_with_size <const Container>::value &&
57
57
  boost::container::is_container_detail::
@@ -61,7 +61,7 @@ struct is_container
61
61
  template <>
62
62
  struct is_container<void>
63
63
  {
64
- static const bool value = false;
64
+ BOOST_STATIC_CONSTEXPR bool value = false;
65
65
  };
66
66
 
67
67
 
@@ -51,7 +51,7 @@ namespace dtl {
51
51
  template <class Container>
52
52
  struct is_contiguous_container
53
53
  {
54
- static const bool value =
54
+ BOOST_STATIC_CONSTEXPR bool value =
55
55
  boost::container::is_contiguous_container_detail::
56
56
  has_member_function_callable_with_data<Container>::value &&
57
57
  boost::container::is_contiguous_container_detail::
@@ -61,25 +61,25 @@ struct pair;
61
61
  template <class T>
62
62
  struct is_pair
63
63
  {
64
- static const bool value = false;
64
+ BOOST_STATIC_CONSTEXPR bool value = false;
65
65
  };
66
66
 
67
67
  template <class T1, class T2>
68
68
  struct is_pair< pair<T1, T2> >
69
69
  {
70
- static const bool value = true;
70
+ BOOST_STATIC_CONSTEXPR bool value = true;
71
71
  };
72
72
 
73
73
  template <class T1, class T2>
74
74
  struct is_pair< std::pair<T1, T2> >
75
75
  {
76
- static const bool value = true;
76
+ BOOST_STATIC_CONSTEXPR bool value = true;
77
77
  };
78
78
 
79
79
  template <class T>
80
80
  struct is_not_pair
81
81
  {
82
- static const bool value = !is_pair<T>::value;
82
+ BOOST_STATIC_CONSTEXPR bool value = !is_pair<T>::value;
83
83
  };
84
84
 
85
85
  } //namespace dtl {
@@ -723,50 +723,50 @@ struct has_iterator_category
723
723
  template <typename X>
724
724
  static two test(int, ...);
725
725
 
726
- static const bool value = (1 == sizeof(test<T>(0, 0)));
726
+ BOOST_STATIC_CONSTEXPR bool value = (1 == sizeof(test<T>(0, 0)));
727
727
  };
728
728
 
729
729
 
730
730
  template<class T, bool = has_iterator_category<T>::value >
731
731
  struct is_input_iterator
732
732
  {
733
- static const bool value = is_same<typename T::iterator_category, std::input_iterator_tag>::value;
733
+ BOOST_STATIC_CONSTEXPR bool value = is_same<typename T::iterator_category, std::input_iterator_tag>::value;
734
734
  };
735
735
 
736
736
  template<class T>
737
737
  struct is_input_iterator<T, false>
738
738
  {
739
- static const bool value = false;
739
+ BOOST_STATIC_CONSTEXPR bool value = false;
740
740
  };
741
741
 
742
742
  template<class T>
743
743
  struct is_not_input_iterator
744
744
  {
745
- static const bool value = !is_input_iterator<T>::value;
745
+ BOOST_STATIC_CONSTEXPR bool value = !is_input_iterator<T>::value;
746
746
  };
747
747
 
748
748
  template<class T, bool = has_iterator_category<T>::value >
749
749
  struct is_forward_iterator
750
750
  {
751
- static const bool value = is_same<typename T::iterator_category, std::forward_iterator_tag>::value;
751
+ BOOST_STATIC_CONSTEXPR bool value = is_same<typename T::iterator_category, std::forward_iterator_tag>::value;
752
752
  };
753
753
 
754
754
  template<class T>
755
755
  struct is_forward_iterator<T, false>
756
756
  {
757
- static const bool value = false;
757
+ BOOST_STATIC_CONSTEXPR bool value = false;
758
758
  };
759
759
 
760
760
  template<class T, bool = has_iterator_category<T>::value >
761
761
  struct is_bidirectional_iterator
762
762
  {
763
- static const bool value = is_same<typename T::iterator_category, std::bidirectional_iterator_tag>::value;
763
+ BOOST_STATIC_CONSTEXPR bool value = is_same<typename T::iterator_category, std::bidirectional_iterator_tag>::value;
764
764
  };
765
765
 
766
766
  template<class T>
767
767
  struct is_bidirectional_iterator<T, false>
768
768
  {
769
- static const bool value = false;
769
+ BOOST_STATIC_CONSTEXPR bool value = false;
770
770
  };
771
771
 
772
772
  template<class IINodeType>
@@ -100,7 +100,7 @@ struct upper_power_of_2_loop_ct
100
100
  template <Integer I, Integer P>
101
101
  struct apply
102
102
  {
103
- static const Integer value =
103
+ BOOST_STATIC_CONSTEXPR Integer value =
104
104
  upper_power_of_2_loop_ct<Integer, (I > P*2)>::template apply<I, P*2>::value;
105
105
  };
106
106
  };
@@ -111,14 +111,14 @@ struct upper_power_of_2_loop_ct<Integer, false>
111
111
  template <Integer I, Integer P>
112
112
  struct apply
113
113
  {
114
- static const Integer value = P;
114
+ BOOST_STATIC_CONSTEXPR Integer value = P;
115
115
  };
116
116
  };
117
117
 
118
118
  template <typename Integer, Integer I>
119
119
  struct upper_power_of_2_ct
120
120
  {
121
- static const Integer value = upper_power_of_2_loop_ct<Integer, (I > 1)>::template apply<I, 2>::value;
121
+ BOOST_STATIC_CONSTEXPR Integer value = upper_power_of_2_loop_ct<Integer, (I > 1)>::template apply<I, 2>::value;
122
122
  };
123
123
 
124
124
  //This function uses binary search to discover the
@@ -144,27 +144,27 @@ inline std::size_t floor_log2 (std::size_t x)
144
144
  template<std::size_t I1, std::size_t I2>
145
145
  struct gcd_ct
146
146
  {
147
- static const std::size_t Max = I1 > I2 ? I1 : I2;
148
- static const std::size_t Min = I1 < I2 ? I1 : I2;
149
- static const std::size_t value = gcd_ct<Min, Max % Min>::value;
147
+ BOOST_STATIC_CONSTEXPR std::size_t Max = I1 > I2 ? I1 : I2;
148
+ BOOST_STATIC_CONSTEXPR std::size_t Min = I1 < I2 ? I1 : I2;
149
+ BOOST_STATIC_CONSTEXPR std::size_t value = gcd_ct<Min, Max % Min>::value;
150
150
  };
151
151
 
152
152
  template<std::size_t I1>
153
153
  struct gcd_ct<I1, 0>
154
154
  {
155
- static const std::size_t value = I1;
155
+ BOOST_STATIC_CONSTEXPR std::size_t value = I1;
156
156
  };
157
157
 
158
158
  template<std::size_t I1>
159
159
  struct gcd_ct<0, I1>
160
160
  {
161
- static const std::size_t value = I1;
161
+ BOOST_STATIC_CONSTEXPR std::size_t value = I1;
162
162
  };
163
163
 
164
164
  template<std::size_t I1, std::size_t I2>
165
165
  struct lcm_ct
166
166
  {
167
- static const std::size_t value = I1 * I2 / gcd_ct<I1, I2>::value;
167
+ BOOST_STATIC_CONSTEXPR std::size_t value = I1 * I2 / gcd_ct<I1, I2>::value;
168
168
  };
169
169
 
170
170
  } // namespace dtl
@@ -84,13 +84,13 @@ struct void_t { typedef void type; };
84
84
  template <class T, class=void>
85
85
  struct is_transparent_base
86
86
  {
87
- static const bool value = false;
87
+ BOOST_STATIC_CONSTEXPR bool value = false;
88
88
  };
89
89
 
90
90
  template <class T>
91
91
  struct is_transparent_base<T, typename void_t<typename T::is_transparent>::type>
92
92
  {
93
- static const bool value = true;
93
+ BOOST_STATIC_CONSTEXPR bool value = true;
94
94
  };
95
95
 
96
96
  template <class T>
@@ -112,7 +112,7 @@ template<typename...> using variadic_void_t = void;
112
112
  template<typename Allocator, typename = void>
113
113
  struct is_allocator
114
114
  {
115
- static const bool value = false;
115
+ BOOST_STATIC_CONSTEXPR bool value = false;
116
116
  };
117
117
 
118
118
  template <typename T>
@@ -123,7 +123,7 @@ struct is_allocator < Allocator,
123
123
  variadic_void_t< typename Allocator::value_type
124
124
  , decltype(ctad_declval<Allocator&>().allocate(size_t{})) >>
125
125
  {
126
- static const bool value = true;
126
+ BOOST_STATIC_CONSTEXPR bool value = true;
127
127
  };
128
128
 
129
129
  template<class T>
@@ -25,15 +25,17 @@
25
25
  #include <boost/container/container_fwd.hpp>
26
26
  // container/detail
27
27
  #include <boost/move/detail/to_raw_pointer.hpp>
28
- #include <boost/container/detail/transform_iterator.hpp>
29
28
  #include <boost/container/detail/type_traits.hpp>
30
29
  #include <boost/container/detail/placement_new.hpp>
30
+ #include <boost/container/detail/iterator.hpp>
31
31
  // intrusive
32
32
  #include <boost/intrusive/slist.hpp>
33
33
  #include <boost/intrusive/pointer_traits.hpp>
34
34
  #include <boost/intrusive/detail/twin.hpp>
35
35
  // move
36
36
  #include <boost/move/utility_core.hpp>
37
+ #include <boost/move/detail/iterator_to_raw_pointer.hpp>
38
+
37
39
 
38
40
  namespace boost {
39
41
  namespace container {
@@ -187,15 +189,100 @@ class basic_multiallocation_chain
187
189
  }
188
190
  };
189
191
 
190
- template<class T>
191
- struct cast_functor
192
+ template <class Iterator, class T>
193
+ class multialloc_iterator
194
+ : public boost::container::iterator
195
+ < typename Iterator::iterator_category
196
+ , T
197
+ , typename Iterator::difference_type
198
+ , T*
199
+ , T&
200
+ >
192
201
  {
193
- typedef typename dtl::add_reference<T>::type result_type;
194
- template<class U>
195
- result_type operator()(U &ptr) const
196
- { return *static_cast<T*>(static_cast<void*>(&ptr)); }
202
+ public:
203
+ inline explicit multialloc_iterator(const Iterator &it)
204
+ : m_it(it)
205
+ {}
206
+
207
+ inline explicit multialloc_iterator()
208
+ : m_it()
209
+ {}
210
+
211
+ //Constructors
212
+ inline multialloc_iterator& operator++()
213
+ { increment(); return *this; }
214
+
215
+ inline multialloc_iterator operator++(int)
216
+ {
217
+ multialloc_iterator result (*this);
218
+ increment();
219
+ return result;
220
+ }
221
+
222
+ inline friend bool operator== (const multialloc_iterator& i, const multialloc_iterator& i2)
223
+ { return i.equal(i2); }
224
+
225
+ inline friend bool operator!= (const multialloc_iterator& i, const multialloc_iterator& i2)
226
+ { return !(i == i2); }
227
+
228
+ inline friend typename Iterator::difference_type operator- (const multialloc_iterator& i, const multialloc_iterator& i2)
229
+ { return i2.distance_to(i); }
230
+
231
+ //Arithmetic
232
+ inline multialloc_iterator& operator+=(typename Iterator::difference_type off)
233
+ { this->advance(off); return *this; }
234
+
235
+ inline multialloc_iterator operator+(typename Iterator::difference_type off) const
236
+ {
237
+ multialloc_iterator other(*this);
238
+ other.advance(off);
239
+ return other;
240
+ }
241
+
242
+ inline friend multialloc_iterator operator+(typename Iterator::difference_type off, const multialloc_iterator& right)
243
+ { return right + off; }
244
+
245
+ inline multialloc_iterator& operator-=(typename Iterator::difference_type off)
246
+ { this->advance(-off); return *this; }
247
+
248
+ inline multialloc_iterator operator-(typename Iterator::difference_type off) const
249
+ { return *this + (-off); }
250
+
251
+ inline T& operator*() const
252
+ { return *this->operator->(); }
253
+
254
+ inline T* operator->() const
255
+ { return static_cast<T*>(static_cast<void*>(boost::movelib::iterator_to_raw_pointer(m_it))); }
256
+
257
+ inline Iterator & base()
258
+ { return m_it; }
259
+
260
+ inline const Iterator & base() const
261
+ { return m_it; }
262
+
263
+ private:
264
+ Iterator m_it;
265
+
266
+ inline void increment()
267
+ { ++m_it; }
268
+
269
+ inline void decrement()
270
+ { --m_it; }
271
+
272
+ inline bool equal(const multialloc_iterator &other) const
273
+ { return m_it == other.m_it; }
274
+
275
+ inline bool less(const multialloc_iterator &other) const
276
+ { return other.m_it < m_it; }
277
+
278
+ inline void advance(typename Iterator::difference_type n)
279
+ { boost::container::iterator_advance(m_it, n); }
280
+
281
+ inline typename Iterator::difference_type distance_to(const multialloc_iterator &other)const
282
+ { return boost::container::iterator_distance(other.m_it, m_it); }
197
283
  };
198
284
 
285
+
199
286
  template<class MultiallocationChain, class T>
200
287
  class transform_multiallocation_chain
201
288
  : public MultiallocationChain
@@ -217,9 +304,8 @@ class transform_multiallocation_chain
217
304
  { return pointer_traits::static_cast_from(p); }
218
305
 
219
306
  public:
220
- typedef transform_iterator
221
- < typename MultiallocationChain::iterator
222
- , dtl::cast_functor <T> > iterator;
307
+ typedef multialloc_iterator
308
+ <typename MultiallocationChain::iterator, T> iterator;
223
309
  typedef typename MultiallocationChain::size_type size_type;
224
310
  typedef boost::intrusive::twin<pointer> pointer_pair;
225
311
 
@@ -31,12 +31,14 @@
31
31
  #include <boost/container/detail/construct_in_place.hpp>
32
32
  #include <boost/container/detail/destroyers.hpp>
33
33
  #include <boost/move/detail/iterator_to_raw_pointer.hpp>
34
+ #include <boost/move/detail/launder.hpp>
34
35
  #include <boost/container/detail/mpl.hpp>
35
36
  #include <boost/container/detail/placement_new.hpp>
36
37
  #include <boost/move/detail/to_raw_pointer.hpp>
37
38
  #include <boost/container/detail/type_traits.hpp>
38
39
  #include <boost/container/detail/version_type.hpp>
39
40
  #include <boost/container/detail/is_pair.hpp>
41
+ #include <boost/container/detail/pair.hpp>
40
42
  // intrusive
41
43
  #include <boost/intrusive/detail/mpl.hpp>
42
44
  #include <boost/intrusive/options.hpp>
@@ -119,16 +121,16 @@ struct base_node
119
121
  }
120
122
 
121
123
  inline T &get_data()
122
- { return *move_detail::force_ptr<T*>(this->m_storage.data); }
124
+ { return *move_detail::force_ptr<T*>(&this->m_storage); }
123
125
 
124
126
  inline const T &get_data() const
125
- { return *move_detail::force_ptr<const T*>(this->m_storage.data); }
127
+ { return *move_detail::launder_cast<const T*>(&this->m_storage); }
126
128
 
127
129
  inline internal_type &get_real_data()
128
- { return *move_detail::force_ptr<internal_type*>(this->m_storage.data); }
130
+ { return *move_detail::launder_cast<internal_type*>(&this->m_storage); }
129
131
 
130
132
  inline const internal_type &get_real_data() const
131
- { return *move_detail::force_ptr<const internal_type*>(this->m_storage.data); }
133
+ { return *move_detail::launder_cast<const internal_type*>(&this->m_storage); }
132
134
 
133
135
  #if defined(BOOST_CONTAINER_DISABLE_ALIASING_WARNING)
134
136
  #pragma GCC diagnostic pop
@@ -534,6 +536,19 @@ struct node_alloc_holder
534
536
  return this->icont().erase_and_dispose(k, chain_holder.get_chain_builder());
535
537
  }
536
538
 
539
+ template<class Key, class KeyCompare>
540
+ inline size_type erase_key(const Key& k, KeyCompare cmp, version_1)
541
+ {
542
+ return this->icont().erase_and_dispose(k, cmp, Destroyer(this->node_alloc()));
543
+ }
544
+
545
+ template<class Key, class KeyCompare>
546
+ inline size_type erase_key(const Key& k, KeyCompare cmp, version_2)
547
+ {
548
+ allocator_multialloc_chain_node_deallocator<NodeAlloc> chain_holder(this->node_alloc());
549
+ return this->icont().erase_and_dispose(k, cmp, chain_holder.get_chain_builder());
550
+ }
551
+
537
552
  protected:
538
553
  struct cloner
539
554
  {
@@ -52,7 +52,7 @@ class private_node_pool
52
52
 
53
53
  public:
54
54
  typedef typename base_t::multiallocation_chain multiallocation_chain;
55
- static const std::size_t nodes_per_block = NodesPerBlock;
55
+ BOOST_STATIC_CONSTEXPR std::size_t nodes_per_block = NodesPerBlock;
56
56
 
57
57
  //!Constructor from a segment manager. Never throws
58
58
  private_node_pool()