passenger 6.0.8 → 6.0.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (1905) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +288 -0
  3. data/CONTRIBUTORS +15 -0
  4. data/bin/passenger-install-nginx-module +2 -1
  5. data/bin/passenger-status +29 -4
  6. data/build/common_library.rb +2 -1
  7. data/build/integration_tests.rb +8 -7
  8. data/build/ruby_tests.rb +1 -1
  9. data/build/test_basics.rb +8 -5
  10. data/dev/copy_boost_headers +119 -71
  11. data/dev/index_cxx_dependencies.rb +1 -1
  12. data/dev/webpacketpp.patch +39 -0
  13. data/doc/templates/markdown.html.erb +2 -6
  14. data/package.json +20 -18
  15. data/resources/mime.types +1 -0
  16. data/resources/templates/error_renderer/with_details/dist/bundle.js +2 -33
  17. data/resources/templates/error_renderer/with_details/dist/styles.css +2 -2
  18. data/resources/templates/error_renderer/with_details/src/index.html.template +0 -2
  19. data/resources/templates/error_renderer/with_details/webpack.config.js +13 -16
  20. data/resources/templates/error_renderer/without_details/dist/bundle.js +0 -1
  21. data/resources/templates/error_renderer/without_details/dist/styles.css +1 -1
  22. data/resources/templates/error_renderer/without_details/webpack.config.js +13 -16
  23. data/resources/templates/standalone/server.erb +1 -0
  24. data/src/agent/Core/ApiServer.h +35 -0
  25. data/src/agent/Core/ApplicationPool/Group/StateInspection.cpp +1 -0
  26. data/src/agent/Core/ApplicationPool/Options.h +5 -0
  27. data/src/agent/Core/ApplicationPool/Pool.h +9 -1
  28. data/src/agent/Core/Config.h +2 -1
  29. data/src/agent/Core/Controller/CheckoutSession.cpp +24 -13
  30. data/src/agent/Core/Controller/Config.h +6 -2
  31. data/src/agent/Core/Controller/InitRequest.cpp +2 -0
  32. data/src/agent/Core/Controller/InternalUtils.cpp +32 -6
  33. data/src/agent/Core/Controller.h +4 -1
  34. data/src/agent/Core/OptionParser.h +4 -0
  35. data/src/agent/Core/SecurityUpdateChecker.h +4 -4
  36. data/src/agent/Core/SpawningKit/Config/AutoGeneratedCode.h +7 -0
  37. data/src/agent/Core/SpawningKit/Config.h +13 -0
  38. data/src/agent/Core/SpawningKit/Handshake/Prepare.h +4 -0
  39. data/src/agent/Core/SpawningKit/PipeWatcher.h +18 -3
  40. data/src/agent/Core/SpawningKit/Spawner.h +1 -0
  41. data/src/agent/Shared/ApplicationPoolApiKey.h +2 -0
  42. data/src/agent/SpawnEnvSetupper/SpawnEnvSetupperMain.cpp +27 -1
  43. data/src/agent/Watchdog/Config.h +2 -1
  44. data/src/agent/Watchdog/WatchdogMain.cpp +4 -0
  45. data/src/apache2_module/ConfigGeneral/AutoGeneratedDefinitions.cpp +32 -27
  46. data/src/apache2_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.cpp +5 -0
  47. data/src/apache2_module/ConfigGeneral/AutoGeneratedSetterFuncs.cpp +19 -1
  48. data/src/apache2_module/DirConfig/AutoGeneratedCreateFunction.cpp +3 -0
  49. data/src/apache2_module/DirConfig/AutoGeneratedHeaderSerialization.cpp +3 -0
  50. data/src/apache2_module/DirConfig/AutoGeneratedManifestGeneration.cpp +11 -0
  51. data/src/apache2_module/DirConfig/AutoGeneratedMergeFunction.cpp +7 -0
  52. data/src/apache2_module/DirConfig/AutoGeneratedStruct.h +19 -2
  53. data/src/apache2_module/Hooks.cpp +1 -0
  54. data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h +19 -19
  55. data/src/cxx_supportlib/BackgroundEventLoop.cpp +4 -0
  56. data/src/cxx_supportlib/Constants.h +1 -1
  57. data/src/cxx_supportlib/DataStructures/HashedStaticString.h +2 -0
  58. data/src/cxx_supportlib/FileDescriptor.h +8 -0
  59. data/src/cxx_supportlib/IOTools/IOUtils.cpp +4 -4
  60. data/src/cxx_supportlib/LoggingKit/Context.h +1 -1
  61. data/src/cxx_supportlib/SafeLibev.h +2 -0
  62. data/src/cxx_supportlib/ServerKit/HttpHeaderParser.h +3 -0
  63. data/src/cxx_supportlib/ServerKit/http_parser.cpp +740 -430
  64. data/src/cxx_supportlib/ServerKit/http_parser.h +156 -34
  65. data/src/cxx_supportlib/StaticString.h +2 -0
  66. data/src/cxx_supportlib/Utils/HttpConstants.h +1 -1
  67. data/src/cxx_supportlib/vendor-modified/boost/algorithm/string/detail/case_conv.hpp +3 -0
  68. data/src/cxx_supportlib/vendor-modified/boost/algorithm/string/detail/classification.hpp +2 -0
  69. data/src/cxx_supportlib/vendor-modified/boost/algorithm/string/detail/find_format_all.hpp +2 -0
  70. data/src/cxx_supportlib/vendor-modified/boost/algorithm/string/detail/find_iterator.hpp +11 -3
  71. data/src/cxx_supportlib/vendor-modified/boost/algorithm/string/find_iterator.hpp +27 -1
  72. data/src/cxx_supportlib/vendor-modified/boost/align/aligned_alloc.hpp +47 -0
  73. data/src/cxx_supportlib/vendor-modified/boost/align/detail/aligned_alloc_posix.hpp +41 -0
  74. data/src/cxx_supportlib/vendor-modified/boost/align/detail/aligned_alloc_sunos.hpp +34 -0
  75. data/src/cxx_supportlib/vendor-modified/boost/align/detail/is_alignment.hpp +28 -0
  76. data/src/cxx_supportlib/vendor-modified/boost/array.hpp +1 -1
  77. data/src/cxx_supportlib/vendor-modified/boost/asio/any_completion_executor.hpp +344 -0
  78. data/src/cxx_supportlib/vendor-modified/boost/asio/any_completion_handler.hpp +825 -0
  79. data/src/cxx_supportlib/vendor-modified/boost/asio/any_io_executor.hpp +299 -11
  80. data/src/cxx_supportlib/vendor-modified/boost/asio/append.hpp +80 -0
  81. data/src/cxx_supportlib/vendor-modified/boost/asio/as_tuple.hpp +141 -0
  82. data/src/cxx_supportlib/vendor-modified/boost/asio/associated_allocator.hpp +129 -21
  83. data/src/cxx_supportlib/vendor-modified/boost/asio/associated_cancellation_slot.hpp +240 -0
  84. data/src/cxx_supportlib/vendor-modified/boost/asio/associated_executor.hpp +103 -16
  85. data/src/cxx_supportlib/vendor-modified/boost/asio/associated_immediate_executor.hpp +299 -0
  86. data/src/cxx_supportlib/vendor-modified/boost/asio/associator.hpp +37 -0
  87. data/src/cxx_supportlib/vendor-modified/boost/asio/async_result.hpp +1209 -120
  88. data/src/cxx_supportlib/vendor-modified/boost/asio/awaitable.hpp +11 -2
  89. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_datagram_socket.hpp +306 -125
  90. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_deadline_timer.hpp +50 -28
  91. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_file.hpp +831 -0
  92. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_io_object.hpp +1 -1
  93. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_random_access_file.hpp +703 -0
  94. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_raw_socket.hpp +308 -127
  95. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_readable_pipe.hpp +637 -0
  96. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_seq_packet_socket.hpp +130 -56
  97. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_serial_port.hpp +143 -50
  98. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_signal_set.hpp +120 -37
  99. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket.hpp +102 -49
  100. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket_acceptor.hpp +461 -207
  101. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket_iostream.hpp +1 -1
  102. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket_streambuf.hpp +1 -1
  103. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_stream_file.hpp +756 -0
  104. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_stream_socket.hpp +229 -93
  105. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_streambuf.hpp +1 -1
  106. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_streambuf_fwd.hpp +1 -1
  107. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_waitable_timer.hpp +55 -33
  108. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_writable_pipe.hpp +633 -0
  109. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_allocator.hpp +751 -0
  110. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_cancellation_slot.hpp +754 -0
  111. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_executor.hpp +230 -24
  112. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_immediate_executor.hpp +753 -0
  113. data/src/cxx_supportlib/vendor-modified/boost/asio/buffer.hpp +479 -66
  114. data/src/cxx_supportlib/vendor-modified/boost/asio/buffer_registration.hpp +330 -0
  115. data/src/cxx_supportlib/vendor-modified/boost/asio/buffered_read_stream.hpp +43 -10
  116. data/src/cxx_supportlib/vendor-modified/boost/asio/buffered_read_stream_fwd.hpp +1 -1
  117. data/src/cxx_supportlib/vendor-modified/boost/asio/buffered_stream.hpp +39 -10
  118. data/src/cxx_supportlib/vendor-modified/boost/asio/buffered_stream_fwd.hpp +1 -1
  119. data/src/cxx_supportlib/vendor-modified/boost/asio/buffered_write_stream.hpp +43 -10
  120. data/src/cxx_supportlib/vendor-modified/boost/asio/buffered_write_stream_fwd.hpp +1 -1
  121. data/src/cxx_supportlib/vendor-modified/boost/asio/buffers_iterator.hpp +1 -1
  122. data/src/cxx_supportlib/vendor-modified/boost/asio/cancellation_signal.hpp +307 -0
  123. data/src/cxx_supportlib/vendor-modified/boost/asio/cancellation_state.hpp +237 -0
  124. data/src/cxx_supportlib/vendor-modified/boost/asio/cancellation_type.hpp +176 -0
  125. data/src/cxx_supportlib/vendor-modified/boost/asio/co_spawn.hpp +73 -21
  126. data/src/cxx_supportlib/vendor-modified/boost/asio/completion_condition.hpp +1 -1
  127. data/src/cxx_supportlib/vendor-modified/boost/asio/compose.hpp +415 -13
  128. data/src/cxx_supportlib/vendor-modified/boost/asio/connect.hpp +206 -75
  129. data/src/cxx_supportlib/vendor-modified/boost/asio/connect_pipe.hpp +85 -0
  130. data/src/cxx_supportlib/vendor-modified/boost/asio/consign.hpp +90 -0
  131. data/src/cxx_supportlib/vendor-modified/boost/asio/coroutine.hpp +1 -1
  132. data/src/cxx_supportlib/vendor-modified/boost/asio/deadline_timer.hpp +1 -1
  133. data/src/cxx_supportlib/vendor-modified/boost/asio/defer.hpp +139 -47
  134. data/src/cxx_supportlib/vendor-modified/boost/asio/deferred.hpp +804 -0
  135. data/src/cxx_supportlib/vendor-modified/boost/asio/detached.hpp +8 -7
  136. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/array.hpp +1 -1
  137. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/array_fwd.hpp +1 -1
  138. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/assert.hpp +1 -1
  139. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/atomic_count.hpp +4 -1
  140. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/base_from_cancellation_state.hpp +165 -0
  141. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/base_from_completion_cond.hpp +1 -1
  142. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/bind_handler.hpp +276 -65
  143. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/blocking_executor_op.hpp +2 -1
  144. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/buffer_resize_guard.hpp +1 -1
  145. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/buffer_sequence_adapter.hpp +192 -1
  146. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/buffered_stream_storage.hpp +1 -1
  147. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/bulk_executor_op.hpp +2 -1
  148. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/call_stack.hpp +1 -1
  149. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/chrono.hpp +1 -1
  150. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/chrono_time_traits.hpp +1 -1
  151. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/completion_handler.hpp +1 -1
  152. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/composed_work.hpp +330 -0
  153. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/concurrency_hint.hpp +1 -1
  154. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/conditionally_enabled_event.hpp +1 -1
  155. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/conditionally_enabled_mutex.hpp +1 -1
  156. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/config.hpp +578 -81
  157. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/consuming_buffers.hpp +38 -1
  158. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/cstddef.hpp +1 -1
  159. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/cstdint.hpp +3 -1
  160. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/date_time_fwd.hpp +1 -1
  161. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/deadline_timer_service.hpp +41 -1
  162. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/dependent_type.hpp +1 -1
  163. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/descriptor_ops.hpp +42 -2
  164. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/descriptor_read_op.hpp +41 -1
  165. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/descriptor_write_op.hpp +40 -1
  166. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/dev_poll_reactor.hpp +36 -7
  167. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/epoll_reactor.hpp +36 -7
  168. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/event.hpp +1 -1
  169. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/eventfd_select_interrupter.hpp +1 -1
  170. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/exception.hpp +42 -0
  171. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/executor_function.hpp +3 -2
  172. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/executor_op.hpp +2 -1
  173. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/fd_set_adapter.hpp +1 -1
  174. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/fenced_block.hpp +1 -1
  175. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/functional.hpp +7 -1
  176. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/future.hpp +1 -1
  177. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/gcc_arm_fenced_block.hpp +1 -1
  178. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/gcc_hppa_fenced_block.hpp +1 -1
  179. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/gcc_sync_fenced_block.hpp +1 -1
  180. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/gcc_x86_fenced_block.hpp +2 -2
  181. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/global.hpp +1 -1
  182. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_alloc_helpers.hpp +16 -12
  183. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_cont_helpers.hpp +1 -1
  184. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_invoke_helpers.hpp +1 -1
  185. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_tracking.hpp +1 -1
  186. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_type_requirements.hpp +22 -19
  187. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_work.hpp +155 -28
  188. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/hash_map.hpp +1 -1
  189. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/buffer_sequence_adapter.ipp +1 -1
  190. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/descriptor_ops.ipp +367 -5
  191. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/dev_poll_reactor.hpp +21 -1
  192. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/dev_poll_reactor.ipp +27 -4
  193. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/epoll_reactor.hpp +21 -1
  194. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/epoll_reactor.ipp +47 -8
  195. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/eventfd_select_interrupter.ipp +10 -8
  196. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/handler_tracking.ipp +4 -2
  197. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/io_uring_descriptor_service.ipp +207 -0
  198. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/io_uring_file_service.ipp +142 -0
  199. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/io_uring_service.hpp +114 -0
  200. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/io_uring_service.ipp +916 -0
  201. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/io_uring_socket_service_base.ipp +251 -0
  202. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/kqueue_reactor.hpp +21 -1
  203. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/kqueue_reactor.ipp +44 -6
  204. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/null_event.ipp +1 -1
  205. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/pipe_select_interrupter.ipp +1 -1
  206. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/posix_event.ipp +8 -4
  207. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/posix_mutex.ipp +1 -1
  208. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/{reactive_serial_port_service.ipp → posix_serial_port_service.ipp} +38 -19
  209. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/posix_thread.ipp +1 -1
  210. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/posix_tss_ptr.ipp +1 -1
  211. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/reactive_descriptor_service.ipp +16 -9
  212. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/reactive_socket_service_base.ipp +29 -19
  213. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/resolver_service_base.ipp +1 -1
  214. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/scheduler.ipp +25 -4
  215. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/select_reactor.hpp +25 -1
  216. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/select_reactor.ipp +67 -5
  217. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/service_registry.hpp +1 -1
  218. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/service_registry.ipp +1 -1
  219. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/signal_set_service.ipp +164 -6
  220. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_ops.ipp +147 -132
  221. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_select_interrupter.ipp +4 -4
  222. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/strand_executor_service.hpp +24 -42
  223. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/strand_executor_service.ipp +25 -1
  224. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/strand_service.hpp +3 -33
  225. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/strand_service.ipp +29 -5
  226. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/thread_context.ipp +37 -0
  227. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/throw_error.ipp +10 -6
  228. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/timer_queue_ptime.ipp +7 -1
  229. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/timer_queue_set.ipp +1 -1
  230. data/src/cxx_supportlib/vendor-modified/boost/asio/{impl/defer.hpp → detail/initiate_defer.hpp} +52 -48
  231. data/src/cxx_supportlib/vendor-modified/boost/asio/{impl/dispatch.hpp → detail/initiate_dispatch.hpp} +43 -57
  232. data/src/cxx_supportlib/vendor-modified/boost/asio/{impl/post.hpp → detail/initiate_post.hpp} +52 -48
  233. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_control.hpp +1 -1
  234. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_object_impl.hpp +14 -8
  235. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_descriptor_read_at_op.hpp +197 -0
  236. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_descriptor_read_op.hpp +192 -0
  237. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_descriptor_service.hpp +689 -0
  238. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_descriptor_write_at_op.hpp +191 -0
  239. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_descriptor_write_op.hpp +187 -0
  240. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_file_service.hpp +263 -0
  241. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_null_buffers_op.hpp +117 -0
  242. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_operation.hpp +86 -0
  243. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_service.hpp +321 -0
  244. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_accept_op.hpp +287 -0
  245. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_connect_op.hpp +143 -0
  246. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_recv_op.hpp +207 -0
  247. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_recvfrom_op.hpp +208 -0
  248. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_recvmsg_op.hpp +194 -0
  249. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_send_op.hpp +193 -0
  250. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_sendto_op.hpp +196 -0
  251. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_service.hpp +633 -0
  252. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_service_base.hpp +665 -0
  253. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_wait_op.hpp +115 -0
  254. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/is_buffer_sequence.hpp +27 -1
  255. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/is_executor.hpp +1 -1
  256. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/keyword_tss_ptr.hpp +1 -1
  257. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/kqueue_reactor.hpp +37 -8
  258. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/local_free_on_block_exit.hpp +1 -1
  259. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/macos_fenced_block.hpp +1 -1
  260. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/memory.hpp +97 -1
  261. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/mutex.hpp +1 -1
  262. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/non_const_lvalue.hpp +1 -1
  263. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/noncopyable.hpp +1 -1
  264. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_event.hpp +1 -1
  265. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_fenced_block.hpp +1 -1
  266. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_global.hpp +1 -1
  267. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_mutex.hpp +1 -5
  268. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_reactor.hpp +19 -4
  269. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_signal_blocker.hpp +1 -1
  270. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_socket_service.hpp +1 -1
  271. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_static_mutex.hpp +1 -1
  272. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_thread.hpp +1 -1
  273. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_tss_ptr.hpp +1 -1
  274. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/object_pool.hpp +1 -1
  275. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/old_win_sdk_compat.hpp +1 -1
  276. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/op_queue.hpp +1 -1
  277. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/operation.hpp +1 -1
  278. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/pipe_select_interrupter.hpp +1 -1
  279. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/pop_options.hpp +17 -1
  280. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_event.hpp +1 -1
  281. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_fd_set_adapter.hpp +1 -1
  282. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_global.hpp +1 -1
  283. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_mutex.hpp +1 -1
  284. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/{reactive_serial_port_service.hpp → posix_serial_port_service.hpp} +30 -18
  285. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_signal_blocker.hpp +1 -1
  286. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_static_mutex.hpp +1 -1
  287. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_thread.hpp +1 -1
  288. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_tss_ptr.hpp +1 -1
  289. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/push_options.hpp +45 -2
  290. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_descriptor_service.hpp +176 -26
  291. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_null_buffers_op.hpp +35 -1
  292. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_accept_op.hpp +87 -1
  293. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_connect_op.hpp +41 -1
  294. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_recv_op.hpp +40 -1
  295. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_recvfrom_op.hpp +41 -1
  296. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_recvmsg_op.hpp +41 -1
  297. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_send_op.hpp +41 -1
  298. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_sendto_op.hpp +40 -1
  299. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_service.hpp +127 -20
  300. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_service_base.hpp +239 -30
  301. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_wait_op.hpp +35 -1
  302. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactor.hpp +29 -5
  303. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactor_op.hpp +5 -1
  304. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactor_op_queue.hpp +45 -1
  305. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/recycling_allocator.hpp +4 -5
  306. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/regex_fwd.hpp +11 -2
  307. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_endpoint_op.hpp +4 -3
  308. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_op.hpp +1 -1
  309. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_query_op.hpp +4 -3
  310. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolver_service.hpp +9 -7
  311. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolver_service_base.hpp +16 -1
  312. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/scheduler.hpp +17 -8
  313. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/scheduler_operation.hpp +1 -1
  314. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/scheduler_task.hpp +51 -0
  315. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/scheduler_thread_info.hpp +1 -1
  316. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/scoped_lock.hpp +1 -1
  317. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/scoped_ptr.hpp +1 -1
  318. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/select_interrupter.hpp +1 -1
  319. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/select_reactor.hpp +59 -6
  320. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/service_registry.hpp +1 -1
  321. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/signal_blocker.hpp +1 -1
  322. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/signal_handler.hpp +1 -1
  323. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/signal_init.hpp +1 -1
  324. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/signal_op.hpp +5 -1
  325. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/signal_set_service.hpp +67 -4
  326. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/socket_holder.hpp +1 -1
  327. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/socket_ops.hpp +37 -45
  328. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/socket_option.hpp +1 -1
  329. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/socket_select_interrupter.hpp +1 -1
  330. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/socket_types.hpp +12 -1
  331. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/solaris_fenced_block.hpp +1 -1
  332. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/source_location.hpp +1 -1
  333. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/static_mutex.hpp +1 -1
  334. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/std_event.hpp +2 -2
  335. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/std_fenced_block.hpp +1 -1
  336. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/std_global.hpp +1 -1
  337. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/std_mutex.hpp +1 -1
  338. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/std_static_mutex.hpp +1 -1
  339. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/std_thread.hpp +1 -1
  340. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/strand_executor_service.hpp +8 -1
  341. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/strand_service.hpp +4 -5
  342. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/string_view.hpp +1 -1
  343. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/thread.hpp +5 -5
  344. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/thread_context.hpp +10 -1
  345. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/thread_group.hpp +5 -1
  346. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/thread_info_base.hpp +102 -25
  347. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/throw_error.hpp +18 -9
  348. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/throw_exception.hpp +7 -3
  349. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timer_queue.hpp +31 -2
  350. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timer_queue_base.hpp +1 -1
  351. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timer_queue_ptime.hpp +5 -1
  352. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timer_queue_set.hpp +1 -1
  353. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timer_scheduler.hpp +3 -1
  354. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timer_scheduler_fwd.hpp +3 -1
  355. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/tss_ptr.hpp +1 -1
  356. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/type_traits.hpp +17 -1
  357. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/utility.hpp +85 -0
  358. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/variadic_templates.hpp +1 -1
  359. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/wait_handler.hpp +1 -1
  360. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/wait_op.hpp +6 -2
  361. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/winsock_init.hpp +1 -1
  362. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/work_dispatcher.hpp +15 -6
  363. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/wrapped_handler.hpp +1 -1
  364. data/src/cxx_supportlib/vendor-modified/boost/asio/dispatch.hpp +125 -44
  365. data/src/cxx_supportlib/vendor-modified/boost/asio/error.hpp +30 -1
  366. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/allocator.hpp +126 -19
  367. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/any_executor.hpp +708 -249
  368. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/bad_executor.hpp +1 -1
  369. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/blocking.hpp +332 -83
  370. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/blocking_adaptation.hpp +263 -70
  371. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/bulk_execute.hpp +62 -50
  372. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/bulk_guarantee.hpp +324 -90
  373. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/connect.hpp +52 -44
  374. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/context.hpp +73 -14
  375. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/context_as.hpp +40 -9
  376. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/detail/as_invocable.hpp +1 -1
  377. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/detail/as_operation.hpp +5 -1
  378. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/detail/as_receiver.hpp +1 -1
  379. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/detail/bulk_sender.hpp +1 -1
  380. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/detail/submit_receiver.hpp +1 -1
  381. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/detail/void_receiver.hpp +1 -1
  382. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/execute.hpp +80 -54
  383. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/executor.hpp +50 -26
  384. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/impl/bad_executor.ipp +1 -1
  385. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/impl/receiver_invocation_error.ipp +1 -1
  386. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/invocable_archetype.hpp +1 -1
  387. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/mapping.hpp +325 -82
  388. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/occupancy.hpp +73 -14
  389. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/operation_state.hpp +6 -1
  390. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/outstanding_work.hpp +249 -70
  391. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/prefer_only.hpp +7 -3
  392. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/receiver.hpp +6 -1
  393. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/receiver_invocation_error.hpp +1 -1
  394. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/relationship.hpp +248 -70
  395. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/schedule.hpp +26 -24
  396. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/scheduler.hpp +6 -1
  397. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/sender.hpp +6 -1
  398. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/set_done.hpp +19 -17
  399. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/set_error.hpp +19 -17
  400. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/set_value.hpp +25 -23
  401. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/start.hpp +19 -17
  402. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/submit.hpp +34 -29
  403. data/src/cxx_supportlib/vendor-modified/boost/asio/execution.hpp +1 -1
  404. data/src/cxx_supportlib/vendor-modified/boost/asio/execution_context.hpp +1 -1
  405. data/src/cxx_supportlib/vendor-modified/boost/asio/executor.hpp +1 -1
  406. data/src/cxx_supportlib/vendor-modified/boost/asio/executor_work_guard.hpp +130 -50
  407. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/append.hpp +38 -0
  408. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/as_single.hpp +138 -0
  409. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/as_tuple.hpp +38 -0
  410. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/awaitable_operators.hpp +538 -0
  411. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/basic_channel.hpp +493 -0
  412. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/basic_concurrent_channel.hpp +493 -0
  413. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/cancellation_condition.hpp +157 -0
  414. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/channel.hpp +72 -0
  415. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/channel_error.hpp +88 -0
  416. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/channel_traits.hpp +303 -0
  417. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/co_composed.hpp +147 -0
  418. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/co_spawn.hpp +189 -0
  419. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/concurrent_channel.hpp +72 -0
  420. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/coro.hpp +295 -0
  421. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/coro_traits.hpp +230 -0
  422. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/deferred.hpp +38 -0
  423. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_handler.hpp +82 -0
  424. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_message.hpp +131 -0
  425. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_operation.hpp +286 -0
  426. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_payload.hpp +141 -0
  427. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_receive_op.hpp +122 -0
  428. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_send_functions.hpp +146 -0
  429. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_send_op.hpp +150 -0
  430. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_service.hpp +679 -0
  431. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/coro_completion_handler.hpp +171 -0
  432. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/coro_promise_allocator.hpp +143 -0
  433. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/has_signature.hpp +56 -0
  434. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/impl/channel_service.hpp +614 -0
  435. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/partial_promise.hpp +201 -0
  436. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/as_single.hpp +241 -0
  437. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/channel_error.ipp +63 -0
  438. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/co_composed.hpp +1177 -0
  439. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/coro.hpp +1224 -0
  440. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/parallel_group.hpp +794 -0
  441. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/promise.hpp +256 -0
  442. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/use_coro.hpp +216 -0
  443. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/use_promise.hpp +68 -0
  444. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/parallel_group.hpp +463 -0
  445. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/prepend.hpp +38 -0
  446. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/promise.hpp +226 -0
  447. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/use_coro.hpp +197 -0
  448. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/use_promise.hpp +113 -0
  449. data/src/cxx_supportlib/vendor-modified/boost/asio/file_base.hpp +168 -0
  450. data/src/cxx_supportlib/vendor-modified/boost/asio/generic/basic_endpoint.hpp +1 -1
  451. data/src/cxx_supportlib/vendor-modified/boost/asio/generic/datagram_protocol.hpp +1 -1
  452. data/src/cxx_supportlib/vendor-modified/boost/asio/generic/detail/endpoint.hpp +1 -1
  453. data/src/cxx_supportlib/vendor-modified/boost/asio/generic/detail/impl/endpoint.ipp +1 -1
  454. data/src/cxx_supportlib/vendor-modified/boost/asio/generic/raw_protocol.hpp +1 -1
  455. data/src/cxx_supportlib/vendor-modified/boost/asio/generic/seq_packet_protocol.hpp +1 -1
  456. data/src/cxx_supportlib/vendor-modified/boost/asio/generic/stream_protocol.hpp +1 -1
  457. data/src/cxx_supportlib/vendor-modified/boost/asio/handler_alloc_hook.hpp +1 -1
  458. data/src/cxx_supportlib/vendor-modified/boost/asio/handler_continuation_hook.hpp +1 -1
  459. data/src/cxx_supportlib/vendor-modified/boost/asio/handler_invoke_hook.hpp +1 -1
  460. data/src/cxx_supportlib/vendor-modified/boost/asio/high_resolution_timer.hpp +1 -1
  461. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/any_completion_executor.ipp +132 -0
  462. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/any_io_executor.ipp +143 -0
  463. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/append.hpp +227 -0
  464. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/as_tuple.hpp +322 -0
  465. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/awaitable.hpp +785 -26
  466. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/buffered_read_stream.hpp +50 -50
  467. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/buffered_write_stream.hpp +50 -50
  468. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/cancellation_signal.ipp +98 -0
  469. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/co_spawn.hpp +193 -50
  470. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/connect.hpp +170 -127
  471. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/connect_pipe.hpp +75 -0
  472. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/connect_pipe.ipp +151 -0
  473. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/consign.hpp +204 -0
  474. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/deferred.hpp +158 -0
  475. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/detached.hpp +1 -1
  476. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/error.ipp +1 -1
  477. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/execution_context.hpp +1 -1
  478. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/execution_context.ipp +1 -1
  479. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/executor.hpp +1 -2
  480. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/executor.ipp +1 -1
  481. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/handler_alloc_hook.ipp +6 -5
  482. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/io_context.hpp +57 -47
  483. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/io_context.ipp +2 -1
  484. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/multiple_exceptions.ipp +1 -1
  485. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/prepend.hpp +227 -0
  486. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read.hpp +275 -201
  487. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_at.hpp +141 -111
  488. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_until.hpp +498 -378
  489. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/redirect_error.hpp +302 -58
  490. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/serial_port_base.hpp +1 -1
  491. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/serial_port_base.ipp +1 -1
  492. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/spawn.hpp +1375 -285
  493. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/src.hpp +13 -2
  494. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/system_context.hpp +1 -1
  495. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/system_context.ipp +1 -1
  496. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/system_executor.hpp +1 -2
  497. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/thread_pool.hpp +6 -2
  498. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/thread_pool.ipp +5 -4
  499. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/use_awaitable.hpp +43 -21
  500. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/use_future.hpp +28 -3
  501. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/write.hpp +235 -186
  502. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/write_at.hpp +117 -96
  503. data/src/cxx_supportlib/vendor-modified/boost/asio/io_context.hpp +126 -122
  504. data/src/cxx_supportlib/vendor-modified/boost/asio/io_context_strand.hpp +15 -3
  505. data/src/cxx_supportlib/vendor-modified/boost/asio/io_service.hpp +1 -1
  506. data/src/cxx_supportlib/vendor-modified/boost/asio/io_service_strand.hpp +1 -1
  507. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/address.hpp +23 -1
  508. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/address_v4.hpp +98 -3
  509. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/address_v4_iterator.hpp +1 -1
  510. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/address_v4_range.hpp +1 -1
  511. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/address_v6.hpp +81 -6
  512. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/address_v6_iterator.hpp +1 -1
  513. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/address_v6_range.hpp +1 -1
  514. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/bad_address_cast.hpp +11 -1
  515. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_endpoint.hpp +32 -5
  516. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver.hpp +180 -68
  517. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver_entry.hpp +1 -1
  518. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver_iterator.hpp +1 -1
  519. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver_query.hpp +1 -1
  520. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver_results.hpp +1 -1
  521. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/detail/endpoint.hpp +1 -1
  522. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/detail/impl/endpoint.ipp +1 -1
  523. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/detail/socket_option.hpp +1 -1
  524. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/host_name.hpp +1 -1
  525. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/icmp.hpp +1 -1
  526. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address.hpp +1 -1
  527. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address.ipp +1 -1
  528. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address_v4.hpp +1 -1
  529. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address_v4.ipp +1 -1
  530. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address_v6.hpp +1 -1
  531. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address_v6.ipp +2 -2
  532. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/basic_endpoint.hpp +1 -1
  533. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/host_name.ipp +1 -1
  534. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/network_v4.hpp +1 -1
  535. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/network_v4.ipp +4 -2
  536. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/network_v6.hpp +1 -1
  537. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/network_v6.ipp +4 -2
  538. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/multicast.hpp +1 -1
  539. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/network_v4.hpp +2 -2
  540. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/network_v6.hpp +1 -1
  541. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/resolver_base.hpp +1 -1
  542. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/resolver_query_base.hpp +1 -1
  543. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/tcp.hpp +1 -1
  544. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/udp.hpp +1 -1
  545. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/unicast.hpp +1 -1
  546. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/v6_only.hpp +2 -2
  547. data/src/cxx_supportlib/vendor-modified/boost/asio/is_applicable_property.hpp +1 -1
  548. data/src/cxx_supportlib/vendor-modified/boost/asio/is_contiguous_iterator.hpp +47 -0
  549. data/src/cxx_supportlib/vendor-modified/boost/asio/is_executor.hpp +1 -1
  550. data/src/cxx_supportlib/vendor-modified/boost/asio/is_read_buffered.hpp +1 -1
  551. data/src/cxx_supportlib/vendor-modified/boost/asio/is_write_buffered.hpp +1 -1
  552. data/src/cxx_supportlib/vendor-modified/boost/asio/local/basic_endpoint.hpp +1 -1
  553. data/src/cxx_supportlib/vendor-modified/boost/asio/local/connect_pair.hpp +1 -1
  554. data/src/cxx_supportlib/vendor-modified/boost/asio/local/datagram_protocol.hpp +1 -1
  555. data/src/cxx_supportlib/vendor-modified/boost/asio/local/detail/endpoint.hpp +1 -1
  556. data/src/cxx_supportlib/vendor-modified/boost/asio/local/detail/impl/endpoint.ipp +3 -8
  557. data/src/cxx_supportlib/vendor-modified/boost/asio/local/seq_packet_protocol.hpp +86 -0
  558. data/src/cxx_supportlib/vendor-modified/boost/asio/local/stream_protocol.hpp +1 -1
  559. data/src/cxx_supportlib/vendor-modified/boost/asio/multiple_exceptions.hpp +1 -1
  560. data/src/cxx_supportlib/vendor-modified/boost/asio/packaged_task.hpp +1 -1
  561. data/src/cxx_supportlib/vendor-modified/boost/asio/placeholders.hpp +1 -1
  562. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/basic_descriptor.hpp +111 -27
  563. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/basic_stream_descriptor.hpp +136 -37
  564. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/descriptor.hpp +1 -1
  565. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/descriptor_base.hpp +1 -1
  566. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/stream_descriptor.hpp +1 -1
  567. data/src/cxx_supportlib/vendor-modified/boost/asio/post.hpp +139 -47
  568. data/src/cxx_supportlib/vendor-modified/boost/asio/prefer.hpp +243 -165
  569. data/src/cxx_supportlib/vendor-modified/boost/asio/prepend.hpp +80 -0
  570. data/src/cxx_supportlib/vendor-modified/boost/asio/query.hpp +85 -57
  571. data/src/cxx_supportlib/vendor-modified/boost/asio/random_access_file.hpp +37 -0
  572. data/src/cxx_supportlib/vendor-modified/boost/asio/read.hpp +381 -189
  573. data/src/cxx_supportlib/vendor-modified/boost/asio/read_at.hpp +154 -53
  574. data/src/cxx_supportlib/vendor-modified/boost/asio/read_until.hpp +529 -226
  575. data/src/cxx_supportlib/vendor-modified/boost/asio/readable_pipe.hpp +37 -0
  576. data/src/cxx_supportlib/vendor-modified/boost/asio/recycling_allocator.hpp +140 -0
  577. data/src/cxx_supportlib/vendor-modified/boost/asio/redirect_error.hpp +3 -3
  578. data/src/cxx_supportlib/vendor-modified/boost/asio/registered_buffer.hpp +358 -0
  579. data/src/cxx_supportlib/vendor-modified/boost/asio/require.hpp +147 -100
  580. data/src/cxx_supportlib/vendor-modified/boost/asio/require_concept.hpp +105 -63
  581. data/src/cxx_supportlib/vendor-modified/boost/asio/serial_port.hpp +1 -1
  582. data/src/cxx_supportlib/vendor-modified/boost/asio/serial_port_base.hpp +1 -1
  583. data/src/cxx_supportlib/vendor-modified/boost/asio/signal_set.hpp +1 -1
  584. data/src/cxx_supportlib/vendor-modified/boost/asio/signal_set_base.hpp +184 -0
  585. data/src/cxx_supportlib/vendor-modified/boost/asio/socket_base.hpp +1 -1
  586. data/src/cxx_supportlib/vendor-modified/boost/asio/spawn.hpp +655 -93
  587. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/context.hpp +4 -1
  588. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/context_base.hpp +24 -24
  589. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/buffered_handshake_op.hpp +2 -2
  590. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/engine.hpp +9 -1
  591. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/handshake_op.hpp +2 -2
  592. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/impl/engine.ipp +33 -1
  593. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/impl/openssl_init.ipp +7 -3
  594. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/io.hpp +44 -24
  595. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/openssl_init.hpp +1 -1
  596. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/openssl_types.hpp +1 -1
  597. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/password_callback.hpp +1 -1
  598. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/read_op.hpp +2 -2
  599. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/shutdown_op.hpp +3 -3
  600. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/stream_core.hpp +53 -1
  601. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/verify_callback.hpp +1 -1
  602. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/write_op.hpp +2 -2
  603. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/error.hpp +1 -1
  604. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/host_name_verification.hpp +1 -1
  605. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/context.hpp +1 -1
  606. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/context.ipp +154 -71
  607. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/error.ipp +25 -3
  608. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/host_name_verification.ipp +1 -1
  609. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/rfc2818_verification.ipp +1 -1
  610. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/src.hpp +1 -1
  611. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/rfc2818_verification.hpp +1 -1
  612. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/stream.hpp +227 -54
  613. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/stream_base.hpp +1 -1
  614. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/verify_context.hpp +1 -1
  615. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/verify_mode.hpp +1 -1
  616. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl.hpp +1 -1
  617. data/src/cxx_supportlib/vendor-modified/boost/asio/static_thread_pool.hpp +1 -1
  618. data/src/cxx_supportlib/vendor-modified/boost/asio/steady_timer.hpp +1 -1
  619. data/src/cxx_supportlib/vendor-modified/boost/asio/strand.hpp +77 -30
  620. data/src/cxx_supportlib/vendor-modified/boost/asio/stream_file.hpp +37 -0
  621. data/src/cxx_supportlib/vendor-modified/boost/asio/streambuf.hpp +1 -1
  622. data/src/cxx_supportlib/vendor-modified/boost/asio/system_context.hpp +1 -1
  623. data/src/cxx_supportlib/vendor-modified/boost/asio/system_executor.hpp +18 -9
  624. data/src/cxx_supportlib/vendor-modified/boost/asio/system_timer.hpp +1 -1
  625. data/src/cxx_supportlib/vendor-modified/boost/asio/this_coro.hpp +236 -1
  626. data/src/cxx_supportlib/vendor-modified/boost/asio/thread_pool.hpp +48 -14
  627. data/src/cxx_supportlib/vendor-modified/boost/asio/time_traits.hpp +1 -1
  628. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/bulk_execute_free.hpp +1 -1
  629. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/bulk_execute_member.hpp +1 -1
  630. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/connect_free.hpp +1 -1
  631. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/connect_member.hpp +1 -1
  632. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/equality_comparable.hpp +7 -3
  633. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/execute_free.hpp +1 -1
  634. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/execute_member.hpp +1 -1
  635. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/prefer_free.hpp +1 -1
  636. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/prefer_member.hpp +1 -1
  637. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/query_free.hpp +1 -1
  638. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/query_member.hpp +1 -1
  639. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/query_static_constexpr_member.hpp +1 -1
  640. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/require_concept_free.hpp +1 -1
  641. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/require_concept_member.hpp +1 -1
  642. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/require_free.hpp +1 -1
  643. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/require_member.hpp +1 -1
  644. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/schedule_free.hpp +1 -1
  645. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/schedule_member.hpp +1 -1
  646. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/set_done_free.hpp +1 -1
  647. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/set_done_member.hpp +1 -1
  648. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/set_error_free.hpp +1 -1
  649. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/set_error_member.hpp +1 -1
  650. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/set_value_free.hpp +1 -1
  651. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/set_value_member.hpp +1 -1
  652. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/start_free.hpp +1 -1
  653. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/start_member.hpp +1 -1
  654. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/static_query.hpp +1 -1
  655. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/static_require.hpp +1 -1
  656. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/static_require_concept.hpp +3 -2
  657. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/submit_free.hpp +1 -1
  658. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/submit_member.hpp +1 -1
  659. data/src/cxx_supportlib/vendor-modified/boost/asio/ts/buffer.hpp +1 -1
  660. data/src/cxx_supportlib/vendor-modified/boost/asio/ts/executor.hpp +1 -1
  661. data/src/cxx_supportlib/vendor-modified/boost/asio/ts/internet.hpp +1 -1
  662. data/src/cxx_supportlib/vendor-modified/boost/asio/ts/io_context.hpp +1 -1
  663. data/src/cxx_supportlib/vendor-modified/boost/asio/ts/net.hpp +1 -1
  664. data/src/cxx_supportlib/vendor-modified/boost/asio/ts/netfwd.hpp +3 -11
  665. data/src/cxx_supportlib/vendor-modified/boost/asio/ts/socket.hpp +1 -1
  666. data/src/cxx_supportlib/vendor-modified/boost/asio/ts/timer.hpp +1 -1
  667. data/src/cxx_supportlib/vendor-modified/boost/asio/unyield.hpp +1 -1
  668. data/src/cxx_supportlib/vendor-modified/boost/asio/use_awaitable.hpp +13 -15
  669. data/src/cxx_supportlib/vendor-modified/boost/asio/use_future.hpp +10 -7
  670. data/src/cxx_supportlib/vendor-modified/boost/asio/uses_executor.hpp +1 -1
  671. data/src/cxx_supportlib/vendor-modified/boost/asio/version.hpp +2 -2
  672. data/src/cxx_supportlib/vendor-modified/boost/asio/wait_traits.hpp +1 -1
  673. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/basic_object_handle.hpp +81 -23
  674. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/basic_overlapped_handle.hpp +110 -11
  675. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/basic_random_access_handle.hpp +125 -36
  676. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/basic_stream_handle.hpp +122 -35
  677. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/object_handle.hpp +1 -1
  678. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/overlapped_handle.hpp +1 -1
  679. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/overlapped_ptr.hpp +9 -9
  680. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/random_access_handle.hpp +1 -1
  681. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/stream_handle.hpp +1 -1
  682. data/src/cxx_supportlib/vendor-modified/boost/asio/writable_pipe.hpp +37 -0
  683. data/src/cxx_supportlib/vendor-modified/boost/asio/write.hpp +378 -186
  684. data/src/cxx_supportlib/vendor-modified/boost/asio/write_at.hpp +156 -53
  685. data/src/cxx_supportlib/vendor-modified/boost/asio/yield.hpp +1 -1
  686. data/src/cxx_supportlib/vendor-modified/boost/asio.hpp +35 -1
  687. data/src/cxx_supportlib/vendor-modified/boost/assert/source_location.hpp +120 -21
  688. data/src/cxx_supportlib/vendor-modified/boost/atomic/atomic.hpp +8 -15
  689. data/src/cxx_supportlib/vendor-modified/boost/atomic/atomic_ref.hpp +14 -1
  690. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/addressof.hpp +5 -1
  691. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/atomic_impl.hpp +183 -64
  692. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/atomic_ref_impl.hpp +169 -67
  693. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/bitwise_cast.hpp +83 -12
  694. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/bitwise_fp_cast.hpp +40 -11
  695. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/caps_arch_gcc_aarch32.hpp +8 -1
  696. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/caps_arch_gcc_aarch64.hpp +8 -1
  697. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/caps_arch_gcc_arm.hpp +8 -1
  698. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/classify.hpp +19 -10
  699. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/config.hpp +29 -60
  700. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_gcc_aarch64.hpp +6 -6
  701. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_gcc_ppc.hpp +105 -100
  702. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_gcc_x86.hpp +107 -40
  703. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_msvc_arm.hpp +4 -4
  704. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_msvc_x86.hpp +32 -5
  705. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_fp_ops_generic.hpp +1 -1
  706. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_ops_gcc_aarch32.hpp +32 -32
  707. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_ops_gcc_aarch64.hpp +15 -15
  708. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_ops_gcc_ppc.hpp +73 -72
  709. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/futex.hpp +8 -1
  710. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/gcc_arm_asm_common.hpp +4 -0
  711. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/gcc_ppc_asm_common.hpp +33 -0
  712. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/int_sizes.hpp +25 -1
  713. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/platform.hpp +15 -6
  714. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/alignment_of.hpp +3 -3
  715. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/has_unique_object_representations.hpp +143 -0
  716. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/is_enum.hpp +42 -0
  717. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/is_nothrow_default_constructible.hpp +46 -0
  718. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/remove_cv.hpp +42 -0
  719. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/wait_caps_darwin_ulock.hpp +58 -0
  720. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/wait_caps_windows.hpp +3 -1
  721. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/wait_on_address.hpp +65 -0
  722. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/wait_ops_darwin_ulock.hpp +158 -0
  723. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/wait_ops_windows.hpp +55 -26
  724. data/src/cxx_supportlib/vendor-modified/boost/atomic/ipc_atomic.hpp +8 -2
  725. data/src/cxx_supportlib/vendor-modified/boost/atomic/ipc_atomic_ref.hpp +14 -1
  726. data/src/cxx_supportlib/vendor-modified/boost/bind/apply.hpp +14 -0
  727. data/src/cxx_supportlib/vendor-modified/boost/bind/bind.hpp +9 -28
  728. data/src/cxx_supportlib/vendor-modified/boost/bind/bind_mf2_cc.hpp +18 -18
  729. data/src/cxx_supportlib/vendor-modified/boost/bind/bind_mf_cc.hpp +18 -18
  730. data/src/cxx_supportlib/vendor-modified/boost/bind/detail/is_same.hpp +36 -0
  731. data/src/cxx_supportlib/vendor-modified/boost/bind/detail/requires_cxx11.hpp +22 -0
  732. data/src/cxx_supportlib/vendor-modified/boost/bind/detail/result_traits.hpp +165 -0
  733. data/src/cxx_supportlib/vendor-modified/boost/bind/mem_fn.hpp +3 -2
  734. data/src/cxx_supportlib/vendor-modified/boost/bind/placeholders.hpp +12 -0
  735. data/src/cxx_supportlib/vendor-modified/boost/bind/protect.hpp +53 -8
  736. data/src/cxx_supportlib/vendor-modified/boost/bind/std_placeholders.hpp +40 -0
  737. data/src/cxx_supportlib/vendor-modified/boost/bind/storage.hpp +1 -0
  738. data/src/cxx_supportlib/vendor-modified/boost/cerrno.hpp +4 -320
  739. data/src/cxx_supportlib/vendor-modified/boost/chrono/config.hpp +2 -0
  740. data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/inlined/mac/chrono.hpp +4 -4
  741. data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/requires_cxx11.hpp +23 -0
  742. data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/scan_keyword.hpp +4 -2
  743. data/src/cxx_supportlib/vendor-modified/boost/chrono/duration.hpp +9 -6
  744. data/src/cxx_supportlib/vendor-modified/boost/chrono/io/duration_get.hpp +1 -1
  745. data/src/cxx_supportlib/vendor-modified/boost/chrono/io/duration_io.hpp +4 -4
  746. data/src/cxx_supportlib/vendor-modified/boost/chrono/io/duration_put.hpp +5 -5
  747. data/src/cxx_supportlib/vendor-modified/boost/chrono/io/duration_style.hpp +1 -1
  748. data/src/cxx_supportlib/vendor-modified/boost/chrono/io/duration_units.hpp +2 -2
  749. data/src/cxx_supportlib/vendor-modified/boost/chrono/io/time_point_io.hpp +3 -3
  750. data/src/cxx_supportlib/vendor-modified/boost/chrono/io/timezone.hpp +2 -1
  751. data/src/cxx_supportlib/vendor-modified/boost/chrono/io/utility/ios_base_state_ptr.hpp +7 -7
  752. data/src/cxx_supportlib/vendor-modified/boost/chrono/io_v1/chrono_io.hpp +3 -3
  753. data/src/cxx_supportlib/vendor-modified/boost/chrono/time_point.hpp +1 -1
  754. data/src/cxx_supportlib/vendor-modified/boost/circular_buffer/base.hpp +6 -6
  755. data/src/cxx_supportlib/vendor-modified/boost/circular_buffer/details.hpp +5 -1
  756. data/src/cxx_supportlib/vendor-modified/boost/circular_buffer/space_optimized.hpp +2 -2
  757. data/src/cxx_supportlib/vendor-modified/boost/circular_buffer.hpp +1 -1
  758. data/src/cxx_supportlib/vendor-modified/boost/concept/detail/general.hpp +21 -0
  759. data/src/cxx_supportlib/vendor-modified/boost/concept/usage.hpp +7 -0
  760. data/src/cxx_supportlib/vendor-modified/boost/concept_check.hpp +1 -1
  761. data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx03.hpp +211 -0
  762. data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx11.hpp +209 -0
  763. data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx14.hpp +47 -0
  764. data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx17.hpp +62 -0
  765. data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx20.hpp +59 -0
  766. data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx98.hpp +23 -0
  767. data/src/cxx_supportlib/vendor-modified/boost/config/auto_link.hpp +7 -6
  768. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/borland.hpp +1 -0
  769. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/clang.hpp +16 -3
  770. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/clang_version.hpp +83 -0
  771. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/codegear.hpp +1 -0
  772. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/common_edg.hpp +32 -11
  773. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/cray.hpp +1 -0
  774. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/digitalmars.hpp +1 -0
  775. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/gcc.hpp +14 -6
  776. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/gcc_xml.hpp +1 -0
  777. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/hp_acc.hpp +1 -0
  778. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/intel.hpp +1 -0
  779. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/metrowerks.hpp +1 -0
  780. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/mpw.hpp +1 -0
  781. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/nvcc.hpp +3 -0
  782. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/pathscale.hpp +1 -0
  783. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/sunpro_cc.hpp +7 -0
  784. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/vacpp.hpp +1 -0
  785. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/visualc.hpp +27 -3
  786. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/xlcpp.hpp +9 -0
  787. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/xlcpp_zos.hpp +1 -0
  788. data/src/cxx_supportlib/vendor-modified/boost/config/detail/cxx_composite.hpp +203 -0
  789. data/src/cxx_supportlib/vendor-modified/boost/config/detail/select_platform_config.hpp +5 -0
  790. data/src/cxx_supportlib/vendor-modified/boost/config/detail/suffix.hpp +184 -3
  791. data/src/cxx_supportlib/vendor-modified/boost/config/header_deprecated.hpp +1 -1
  792. data/src/cxx_supportlib/vendor-modified/boost/config/platform/bsd.hpp +5 -8
  793. data/src/cxx_supportlib/vendor-modified/boost/config/platform/wasm.hpp +23 -0
  794. data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/dinkumware.hpp +66 -6
  795. data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/libcpp.hpp +36 -1
  796. data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/libstdcpp3.hpp +132 -7
  797. data/src/cxx_supportlib/vendor-modified/boost/config/workaround.hpp +11 -0
  798. data/src/cxx_supportlib/vendor-modified/boost/container/adaptive_pool.hpp +22 -8
  799. data/src/cxx_supportlib/vendor-modified/boost/container/allocator.hpp +20 -12
  800. data/src/cxx_supportlib/vendor-modified/boost/container/allocator_traits.hpp +9 -0
  801. data/src/cxx_supportlib/vendor-modified/boost/container/container_fwd.hpp +7 -3
  802. data/src/cxx_supportlib/vendor-modified/boost/container/deque.hpp +237 -175
  803. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool.hpp +2 -2
  804. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool_impl.hpp +14 -13
  805. data/src/cxx_supportlib/vendor-modified/boost/container/detail/addressof.hpp +2 -10
  806. data/src/cxx_supportlib/vendor-modified/boost/container/detail/advanced_insert_int.hpp +182 -135
  807. data/src/cxx_supportlib/vendor-modified/boost/container/detail/algorithm.hpp +28 -0
  808. data/src/cxx_supportlib/vendor-modified/boost/container/detail/allocator_version_traits.hpp +14 -15
  809. data/src/cxx_supportlib/vendor-modified/boost/container/detail/compare_functors.hpp +14 -10
  810. data/src/cxx_supportlib/vendor-modified/boost/container/detail/config_begin.hpp +11 -3
  811. data/src/cxx_supportlib/vendor-modified/boost/container/detail/config_end.hpp +3 -0
  812. data/src/cxx_supportlib/vendor-modified/boost/container/detail/construct_in_place.hpp +17 -15
  813. data/src/cxx_supportlib/vendor-modified/boost/container/detail/container_rebind.hpp +3 -3
  814. data/src/cxx_supportlib/vendor-modified/boost/container/detail/copy_move_algo.hpp +961 -151
  815. data/src/cxx_supportlib/vendor-modified/boost/container/detail/destroyers.hpp +181 -57
  816. data/src/cxx_supportlib/vendor-modified/boost/container/detail/dispatch_uses_allocator.hpp +59 -59
  817. data/src/cxx_supportlib/vendor-modified/boost/container/detail/flat_tree.hpp +218 -143
  818. data/src/cxx_supportlib/vendor-modified/boost/container/detail/guards_dended.hpp +198 -0
  819. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_container.hpp +10 -0
  820. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_contiguous_container.hpp +35 -0
  821. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_pair.hpp +91 -0
  822. data/src/cxx_supportlib/vendor-modified/boost/container/detail/iterator.hpp +8 -0
  823. data/src/cxx_supportlib/vendor-modified/boost/container/detail/iterators.hpp +88 -69
  824. data/src/cxx_supportlib/vendor-modified/boost/container/detail/multiallocation_chain.hpp +14 -10
  825. data/src/cxx_supportlib/vendor-modified/boost/container/detail/mutex.hpp +48 -23
  826. data/src/cxx_supportlib/vendor-modified/boost/container/detail/next_capacity.hpp +24 -3
  827. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_alloc_holder.hpp +252 -119
  828. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_pool.hpp +2 -2
  829. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_pool_impl.hpp +12 -12
  830. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pair.hpp +19 -91
  831. data/src/cxx_supportlib/vendor-modified/boost/container/detail/placement_new.hpp +1 -7
  832. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_common_alloc.hpp +1 -1
  833. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_resource.hpp +3 -7
  834. data/src/cxx_supportlib/vendor-modified/boost/container/detail/std_fwd.hpp +3 -0
  835. data/src/cxx_supportlib/vendor-modified/boost/container/detail/transform_iterator.hpp +28 -28
  836. data/src/cxx_supportlib/vendor-modified/boost/container/detail/tree.hpp +249 -342
  837. data/src/cxx_supportlib/vendor-modified/boost/container/detail/type_traits.hpp +3 -0
  838. data/src/cxx_supportlib/vendor-modified/boost/container/detail/value_functors.hpp +4 -14
  839. data/src/cxx_supportlib/vendor-modified/boost/container/detail/workaround.hpp +67 -10
  840. data/src/cxx_supportlib/vendor-modified/boost/container/devector.hpp +2961 -0
  841. data/src/cxx_supportlib/vendor-modified/boost/container/flat_map.hpp +265 -180
  842. data/src/cxx_supportlib/vendor-modified/boost/container/flat_set.hpp +36 -35
  843. data/src/cxx_supportlib/vendor-modified/boost/container/list.hpp +72 -100
  844. data/src/cxx_supportlib/vendor-modified/boost/container/map.hpp +95 -89
  845. data/src/cxx_supportlib/vendor-modified/boost/container/new_allocator.hpp +10 -3
  846. data/src/cxx_supportlib/vendor-modified/boost/container/node_allocator.hpp +3 -3
  847. data/src/cxx_supportlib/vendor-modified/boost/container/node_handle.hpp +14 -12
  848. data/src/cxx_supportlib/vendor-modified/boost/container/options.hpp +159 -9
  849. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/devector.hpp +51 -0
  850. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/memory_resource.hpp +8 -3
  851. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/monotonic_buffer_resource.hpp +3 -3
  852. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/polymorphic_allocator.hpp +9 -9
  853. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/resource_adaptor.hpp +3 -3
  854. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/synchronized_pool_resource.hpp +3 -3
  855. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/unsynchronized_pool_resource.hpp +3 -3
  856. data/src/cxx_supportlib/vendor-modified/boost/container/scoped_allocator.hpp +0 -2
  857. data/src/cxx_supportlib/vendor-modified/boost/container/set.hpp +32 -43
  858. data/src/cxx_supportlib/vendor-modified/boost/container/slist.hpp +83 -115
  859. data/src/cxx_supportlib/vendor-modified/boost/container/small_vector.hpp +134 -162
  860. data/src/cxx_supportlib/vendor-modified/boost/container/stable_vector.hpp +159 -101
  861. data/src/cxx_supportlib/vendor-modified/boost/container/static_vector.hpp +81 -50
  862. data/src/cxx_supportlib/vendor-modified/boost/container/string.hpp +413 -293
  863. data/src/cxx_supportlib/vendor-modified/boost/container/throw_exception.hpp +140 -26
  864. data/src/cxx_supportlib/vendor-modified/boost/container/vector.hpp +512 -725
  865. data/src/cxx_supportlib/vendor-modified/boost/container_hash/detail/hash_mix.hpp +113 -0
  866. data/src/cxx_supportlib/vendor-modified/boost/container_hash/detail/hash_range.hpp +410 -0
  867. data/src/cxx_supportlib/vendor-modified/boost/container_hash/detail/hash_tuple_like.hpp +156 -0
  868. data/src/cxx_supportlib/vendor-modified/boost/container_hash/detail/mulx.hpp +79 -0
  869. data/src/cxx_supportlib/vendor-modified/boost/container_hash/detail/requires_cxx11.hpp +22 -0
  870. data/src/cxx_supportlib/vendor-modified/boost/container_hash/hash.hpp +486 -571
  871. data/src/cxx_supportlib/vendor-modified/boost/container_hash/hash_fwd.hpp +25 -24
  872. data/src/cxx_supportlib/vendor-modified/boost/container_hash/is_contiguous_range.hpp +92 -0
  873. data/src/cxx_supportlib/vendor-modified/boost/container_hash/is_described_class.hpp +38 -0
  874. data/src/cxx_supportlib/vendor-modified/boost/container_hash/is_range.hpp +74 -0
  875. data/src/cxx_supportlib/vendor-modified/boost/container_hash/is_tuple_like.hpp +42 -0
  876. data/src/cxx_supportlib/vendor-modified/boost/container_hash/is_unordered_range.hpp +39 -0
  877. data/src/cxx_supportlib/vendor-modified/boost/core/alignof.hpp +57 -0
  878. data/src/cxx_supportlib/vendor-modified/boost/core/alloc_construct.hpp +7 -81
  879. data/src/cxx_supportlib/vendor-modified/boost/core/allocator_access.hpp +472 -285
  880. data/src/cxx_supportlib/vendor-modified/boost/core/allocator_traits.hpp +112 -0
  881. data/src/cxx_supportlib/vendor-modified/boost/core/bit.hpp +936 -0
  882. data/src/cxx_supportlib/vendor-modified/boost/core/checked_delete.hpp +20 -3
  883. data/src/cxx_supportlib/vendor-modified/boost/core/cmath.hpp +298 -0
  884. data/src/cxx_supportlib/vendor-modified/boost/core/data.hpp +46 -0
  885. data/src/cxx_supportlib/vendor-modified/boost/core/default_allocator.hpp +19 -9
  886. data/src/cxx_supportlib/vendor-modified/boost/core/detail/is_same.hpp +39 -0
  887. data/src/cxx_supportlib/vendor-modified/boost/core/detail/lwt_unattended.hpp +66 -0
  888. data/src/cxx_supportlib/vendor-modified/boost/core/detail/sp_thread_pause.hpp +71 -0
  889. data/src/cxx_supportlib/vendor-modified/boost/{smart_ptr → core}/detail/sp_thread_sleep.hpp +39 -21
  890. data/src/cxx_supportlib/vendor-modified/boost/core/detail/sp_thread_yield.hpp +100 -0
  891. data/src/cxx_supportlib/vendor-modified/boost/core/detail/sp_win32_sleep.hpp +54 -0
  892. data/src/cxx_supportlib/vendor-modified/boost/core/detail/splitmix64.hpp +54 -0
  893. data/src/cxx_supportlib/vendor-modified/boost/core/detail/string_view.hpp +1272 -0
  894. data/src/cxx_supportlib/vendor-modified/boost/core/empty_value.hpp +25 -16
  895. data/src/cxx_supportlib/vendor-modified/boost/core/fclose_deleter.hpp +46 -0
  896. data/src/cxx_supportlib/vendor-modified/boost/core/identity.hpp +61 -0
  897. data/src/cxx_supportlib/vendor-modified/boost/core/ignore_unused.hpp +32 -2
  898. data/src/cxx_supportlib/vendor-modified/boost/core/is_same.hpp +10 -15
  899. data/src/cxx_supportlib/vendor-modified/boost/core/launder.hpp +55 -0
  900. data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test.hpp +67 -22
  901. data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test_trait.hpp +8 -54
  902. data/src/cxx_supportlib/vendor-modified/boost/core/make_span.hpp +59 -0
  903. data/src/cxx_supportlib/vendor-modified/boost/core/max_align.hpp +82 -0
  904. data/src/cxx_supportlib/vendor-modified/boost/core/memory_resource.hpp +108 -0
  905. data/src/cxx_supportlib/vendor-modified/boost/core/noinit_adaptor.hpp +3 -0
  906. data/src/cxx_supportlib/vendor-modified/boost/core/noncopyable.hpp +1 -1
  907. data/src/cxx_supportlib/vendor-modified/boost/core/pointer_traits.hpp +111 -60
  908. data/src/cxx_supportlib/vendor-modified/boost/core/quick_exit.hpp +1 -1
  909. data/src/cxx_supportlib/vendor-modified/boost/core/ref.hpp +58 -15
  910. data/src/cxx_supportlib/vendor-modified/boost/core/serialization.hpp +131 -0
  911. data/src/cxx_supportlib/vendor-modified/boost/core/size.hpp +31 -0
  912. data/src/cxx_supportlib/vendor-modified/boost/core/snprintf.hpp +173 -0
  913. data/src/cxx_supportlib/vendor-modified/boost/core/span.hpp +399 -0
  914. data/src/cxx_supportlib/vendor-modified/boost/core/swap.hpp +27 -8
  915. data/src/cxx_supportlib/vendor-modified/boost/core/type_name.hpp +1181 -0
  916. data/src/cxx_supportlib/vendor-modified/boost/core/uncaught_exceptions.hpp +7 -7
  917. data/src/cxx_supportlib/vendor-modified/boost/core/verbose_terminate_handler.hpp +88 -0
  918. data/src/cxx_supportlib/vendor-modified/boost/core/yield_primitives.hpp +12 -0
  919. data/src/cxx_supportlib/vendor-modified/boost/cregex.hpp +4 -0
  920. data/src/cxx_supportlib/vendor-modified/boost/date_time/compiler_config.hpp +0 -24
  921. data/src/cxx_supportlib/vendor-modified/boost/date_time/date.hpp +1 -1
  922. data/src/cxx_supportlib/vendor-modified/boost/date_time/date_iterator.hpp +8 -8
  923. data/src/cxx_supportlib/vendor-modified/boost/date_time/gregorian/formatters.hpp +3 -3
  924. data/src/cxx_supportlib/vendor-modified/boost/date_time/gregorian/formatters_limited.hpp +3 -3
  925. data/src/cxx_supportlib/vendor-modified/boost/date_time/gregorian/greg_date.hpp +12 -13
  926. data/src/cxx_supportlib/vendor-modified/boost/date_time/gregorian/parsers.hpp +2 -2
  927. data/src/cxx_supportlib/vendor-modified/boost/date_time/gregorian_calendar.ipp +3 -3
  928. data/src/cxx_supportlib/vendor-modified/boost/date_time/iso_format.hpp +13 -13
  929. data/src/cxx_supportlib/vendor-modified/boost/date_time/local_time/local_date_time.hpp +2 -2
  930. data/src/cxx_supportlib/vendor-modified/boost/date_time/posix_time/conversion.hpp +1 -1
  931. data/src/cxx_supportlib/vendor-modified/boost/date_time/posix_time/posix_time_io.hpp +1 -1
  932. data/src/cxx_supportlib/vendor-modified/boost/date_time/posix_time/time_formatters.hpp +4 -4
  933. data/src/cxx_supportlib/vendor-modified/boost/date_time/posix_time/time_formatters_limited.hpp +2 -2
  934. data/src/cxx_supportlib/vendor-modified/boost/date_time/posix_time/time_parsers.hpp +4 -0
  935. data/src/cxx_supportlib/vendor-modified/boost/date_time/special_values_parser.hpp +1 -1
  936. data/src/cxx_supportlib/vendor-modified/boost/date_time/time_facet.hpp +1 -1
  937. data/src/cxx_supportlib/vendor-modified/boost/date_time/time_iterator.hpp +8 -8
  938. data/src/cxx_supportlib/vendor-modified/boost/date_time/time_parsing.hpp +2 -2
  939. data/src/cxx_supportlib/vendor-modified/boost/describe/bases.hpp +50 -0
  940. data/src/cxx_supportlib/vendor-modified/boost/describe/detail/config.hpp +40 -0
  941. data/src/cxx_supportlib/vendor-modified/boost/describe/detail/cx_streq.hpp +30 -0
  942. data/src/cxx_supportlib/vendor-modified/boost/describe/detail/void_t.hpp +32 -0
  943. data/src/cxx_supportlib/vendor-modified/boost/describe/members.hpp +161 -0
  944. data/src/cxx_supportlib/vendor-modified/boost/describe/modifiers.hpp +33 -0
  945. data/src/cxx_supportlib/vendor-modified/boost/detail/atomic_count.hpp +21 -0
  946. data/src/cxx_supportlib/vendor-modified/boost/detail/workaround.hpp +3 -3
  947. data/src/cxx_supportlib/vendor-modified/boost/exception/detail/exception_ptr.hpp +108 -62
  948. data/src/cxx_supportlib/vendor-modified/boost/exception/detail/type_info.hpp +2 -1
  949. data/src/cxx_supportlib/vendor-modified/boost/exception/diagnostic_information.hpp +3 -3
  950. data/src/cxx_supportlib/vendor-modified/boost/exception/exception.hpp +84 -2
  951. data/src/cxx_supportlib/vendor-modified/boost/exception/info.hpp +1 -4
  952. data/src/cxx_supportlib/vendor-modified/boost/exception/to_string.hpp +1 -1
  953. data/src/cxx_supportlib/vendor-modified/boost/foreach.hpp +3 -3
  954. data/src/cxx_supportlib/vendor-modified/boost/function/detail/epilogue.hpp +39 -0
  955. data/src/cxx_supportlib/vendor-modified/boost/function/detail/prologue.hpp +1 -0
  956. data/src/cxx_supportlib/vendor-modified/boost/function/detail/requires_cxx11.hpp +22 -0
  957. data/src/cxx_supportlib/vendor-modified/boost/function/function_base.hpp +37 -32
  958. data/src/cxx_supportlib/vendor-modified/boost/function/function_template.hpp +24 -0
  959. data/src/cxx_supportlib/vendor-modified/boost/function.hpp +2 -0
  960. data/src/cxx_supportlib/vendor-modified/boost/integer/common_factor.hpp +2 -2
  961. data/src/cxx_supportlib/vendor-modified/boost/integer/common_factor_ct.hpp +2 -2
  962. data/src/cxx_supportlib/vendor-modified/boost/integer/common_factor_rt.hpp +1 -1
  963. data/src/cxx_supportlib/vendor-modified/boost/integer/extended_euclidean.hpp +1 -1
  964. data/src/cxx_supportlib/vendor-modified/boost/integer/integer_log2.hpp +86 -81
  965. data/src/cxx_supportlib/vendor-modified/boost/integer/integer_mask.hpp +2 -2
  966. data/src/cxx_supportlib/vendor-modified/boost/integer/mod_inverse.hpp +1 -1
  967. data/src/cxx_supportlib/vendor-modified/boost/integer/static_log2.hpp +2 -2
  968. data/src/cxx_supportlib/vendor-modified/boost/integer/static_min_max.hpp +2 -2
  969. data/src/cxx_supportlib/vendor-modified/boost/integer.hpp +2 -2
  970. data/src/cxx_supportlib/vendor-modified/boost/integer_fwd.hpp +2 -2
  971. data/src/cxx_supportlib/vendor-modified/boost/integer_traits.hpp +2 -2
  972. data/src/cxx_supportlib/vendor-modified/boost/intrusive/any_hook.hpp +4 -4
  973. data/src/cxx_supportlib/vendor-modified/boost/intrusive/avl_set.hpp +83 -83
  974. data/src/cxx_supportlib/vendor-modified/boost/intrusive/avltree.hpp +43 -43
  975. data/src/cxx_supportlib/vendor-modified/boost/intrusive/avltree_algorithms.hpp +63 -63
  976. data/src/cxx_supportlib/vendor-modified/boost/intrusive/bs_set.hpp +85 -85
  977. data/src/cxx_supportlib/vendor-modified/boost/intrusive/bstree.hpp +101 -109
  978. data/src/cxx_supportlib/vendor-modified/boost/intrusive/bstree_algorithms.hpp +134 -128
  979. data/src/cxx_supportlib/vendor-modified/boost/intrusive/circular_list_algorithms.hpp +35 -27
  980. data/src/cxx_supportlib/vendor-modified/boost/intrusive/circular_slist_algorithms.hpp +88 -19
  981. data/src/cxx_supportlib/vendor-modified/boost/intrusive/derivation_value_traits.hpp +4 -4
  982. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/any_node_and_algorithms.hpp +30 -30
  983. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/array_initializer.hpp +10 -8
  984. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/avltree_node.hpp +14 -14
  985. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/bstree_algorithms_base.hpp +38 -40
  986. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/common_slist_algorithms.hpp +84 -15
  987. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/config_begin.hpp +1 -0
  988. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/default_header_holder.hpp +1 -1
  989. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/empty_node_checker.hpp +1 -1
  990. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/exception_disposer.hpp +0 -31
  991. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/generic_hook.hpp +8 -8
  992. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hash_combine.hpp +92 -0
  993. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hashtable_node.hpp +182 -102
  994. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hook_traits.hpp +9 -8
  995. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/iterator.hpp +115 -69
  996. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/list_iterator.hpp +3 -3
  997. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/list_node.hpp +4 -4
  998. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/math.hpp +7 -55
  999. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/mpl.hpp +1 -1
  1000. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/node_cloner_disposer.hpp +4 -4
  1001. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/node_to_value.hpp +1 -1
  1002. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/rbtree_node.hpp +18 -18
  1003. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/reverse_iterator.hpp +3 -140
  1004. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/simple_disposers.hpp +3 -1
  1005. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/slist_iterator.hpp +12 -4
  1006. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/slist_node.hpp +2 -2
  1007. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/tree_iterator.hpp +2 -2
  1008. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/tree_node.hpp +6 -6
  1009. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/twin.hpp +49 -0
  1010. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/value_functors.hpp +52 -0
  1011. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/workaround.hpp +29 -3
  1012. data/src/cxx_supportlib/vendor-modified/boost/intrusive/hashtable.hpp +1668 -969
  1013. data/src/cxx_supportlib/vendor-modified/boost/intrusive/intrusive_fwd.hpp +2 -0
  1014. data/src/cxx_supportlib/vendor-modified/boost/intrusive/linear_slist_algorithms.hpp +97 -17
  1015. data/src/cxx_supportlib/vendor-modified/boost/intrusive/list.hpp +97 -94
  1016. data/src/cxx_supportlib/vendor-modified/boost/intrusive/list_hook.hpp +10 -10
  1017. data/src/cxx_supportlib/vendor-modified/boost/intrusive/member_value_traits.hpp +4 -4
  1018. data/src/cxx_supportlib/vendor-modified/boost/intrusive/options.hpp +17 -3
  1019. data/src/cxx_supportlib/vendor-modified/boost/intrusive/pack_options.hpp +12 -8
  1020. data/src/cxx_supportlib/vendor-modified/boost/intrusive/parent_from_member.hpp +2 -2
  1021. data/src/cxx_supportlib/vendor-modified/boost/intrusive/pointer_plus_bits.hpp +4 -4
  1022. data/src/cxx_supportlib/vendor-modified/boost/intrusive/pointer_traits.hpp +30 -22
  1023. data/src/cxx_supportlib/vendor-modified/boost/intrusive/priority_compare.hpp +9 -2
  1024. data/src/cxx_supportlib/vendor-modified/boost/intrusive/rbtree.hpp +43 -43
  1025. data/src/cxx_supportlib/vendor-modified/boost/intrusive/rbtree_algorithms.hpp +51 -51
  1026. data/src/cxx_supportlib/vendor-modified/boost/intrusive/set.hpp +85 -85
  1027. data/src/cxx_supportlib/vendor-modified/boost/intrusive/set_hook.hpp +12 -12
  1028. data/src/cxx_supportlib/vendor-modified/boost/intrusive/sg_set.hpp +93 -93
  1029. data/src/cxx_supportlib/vendor-modified/boost/intrusive/sgtree.hpp +58 -66
  1030. data/src/cxx_supportlib/vendor-modified/boost/intrusive/sgtree_algorithms.hpp +40 -40
  1031. data/src/cxx_supportlib/vendor-modified/boost/intrusive/slist.hpp +152 -159
  1032. data/src/cxx_supportlib/vendor-modified/boost/intrusive/slist_hook.hpp +8 -6
  1033. data/src/cxx_supportlib/vendor-modified/boost/intrusive/splay_set.hpp +91 -91
  1034. data/src/cxx_supportlib/vendor-modified/boost/intrusive/splaytree.hpp +46 -46
  1035. data/src/cxx_supportlib/vendor-modified/boost/intrusive/splaytree_algorithms.hpp +59 -57
  1036. data/src/cxx_supportlib/vendor-modified/boost/intrusive/treap.hpp +51 -51
  1037. data/src/cxx_supportlib/vendor-modified/boost/intrusive/treap_algorithms.hpp +37 -39
  1038. data/src/cxx_supportlib/vendor-modified/boost/intrusive/treap_set.hpp +97 -97
  1039. data/src/cxx_supportlib/vendor-modified/boost/intrusive/trivial_value_traits.hpp +6 -4
  1040. data/src/cxx_supportlib/vendor-modified/boost/intrusive/unordered_set.hpp +90 -83
  1041. data/src/cxx_supportlib/vendor-modified/boost/intrusive/unordered_set_hook.hpp +17 -17
  1042. data/src/cxx_supportlib/vendor-modified/boost/iterator/advance.hpp +11 -0
  1043. data/src/cxx_supportlib/vendor-modified/boost/iterator/detail/config_def.hpp +6 -6
  1044. data/src/cxx_supportlib/vendor-modified/boost/iterator/detail/config_undef.hpp +1 -1
  1045. data/src/cxx_supportlib/vendor-modified/boost/iterator/detail/enable_if.hpp +5 -5
  1046. data/src/cxx_supportlib/vendor-modified/boost/iterator/detail/facade_iterator_category.hpp +10 -11
  1047. data/src/cxx_supportlib/vendor-modified/boost/iterator/is_iterator.hpp +148 -0
  1048. data/src/cxx_supportlib/vendor-modified/boost/iterator/iterator_concepts.hpp +2 -2
  1049. data/src/cxx_supportlib/vendor-modified/boost/iterator/iterator_facade.hpp +106 -25
  1050. data/src/cxx_supportlib/vendor-modified/boost/iterator/transform_iterator.hpp +8 -4
  1051. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/bad_lexical_cast.hpp +7 -7
  1052. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical.hpp +1 -1
  1053. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical_streams.hpp +40 -51
  1054. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_numeric.hpp +13 -7
  1055. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/inf_nan.hpp +13 -16
  1056. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/is_character.hpp +1 -1
  1057. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_char_constants.hpp +2 -2
  1058. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_unsigned_converters.hpp +11 -11
  1059. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/widest_char.hpp +1 -1
  1060. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/try_lexical_convert.hpp +5 -5
  1061. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast.hpp +20 -2
  1062. data/src/cxx_supportlib/vendor-modified/boost/libs/random/src/random_device.cpp +1 -1
  1063. data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/posix_api.cpp +13 -25
  1064. data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/regex.cpp +10 -121
  1065. data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/static_mutex.cpp +5 -1
  1066. data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/wide_posix_api.cpp +17 -22
  1067. data/src/cxx_supportlib/vendor-modified/boost/limits.hpp +12 -12
  1068. data/src/cxx_supportlib/vendor-modified/boost/move/algo/adaptive_merge.hpp +48 -36
  1069. data/src/cxx_supportlib/vendor-modified/boost/move/algo/adaptive_sort.hpp +91 -74
  1070. data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/adaptive_sort_merge.hpp +225 -163
  1071. data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/basic_op.hpp +1 -0
  1072. data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/heap_sort.hpp +21 -10
  1073. data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/insertion_sort.hpp +9 -0
  1074. data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/merge.hpp +125 -209
  1075. data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/merge_sort.hpp +24 -15
  1076. data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/pdqsort.hpp +16 -5
  1077. data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/search.hpp +79 -0
  1078. data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/set_difference.hpp +8 -2
  1079. data/src/cxx_supportlib/vendor-modified/boost/move/algo/move.hpp +8 -5
  1080. data/src/cxx_supportlib/vendor-modified/boost/move/algo/predicate.hpp +11 -11
  1081. data/src/cxx_supportlib/vendor-modified/boost/move/algorithm.hpp +0 -1
  1082. data/src/cxx_supportlib/vendor-modified/boost/move/core.hpp +21 -0
  1083. data/src/cxx_supportlib/vendor-modified/boost/move/default_delete.hpp +32 -6
  1084. data/src/cxx_supportlib/vendor-modified/boost/move/detail/addressof.hpp +61 -0
  1085. data/src/cxx_supportlib/vendor-modified/boost/move/detail/config_begin.hpp +1 -0
  1086. data/src/cxx_supportlib/vendor-modified/boost/move/detail/force_ptr.hpp +36 -0
  1087. data/src/cxx_supportlib/vendor-modified/boost/move/detail/fwd_macros.hpp +12 -0
  1088. data/src/cxx_supportlib/vendor-modified/boost/move/detail/iterator_traits.hpp +109 -9
  1089. data/src/cxx_supportlib/vendor-modified/boost/move/detail/meta_utils.hpp +8 -32
  1090. data/src/cxx_supportlib/vendor-modified/boost/move/detail/nsec_clock.hpp +268 -0
  1091. data/src/cxx_supportlib/vendor-modified/boost/move/detail/reverse_iterator.hpp +40 -33
  1092. data/src/cxx_supportlib/vendor-modified/boost/move/detail/std_ns_begin.hpp +5 -1
  1093. data/src/cxx_supportlib/vendor-modified/boost/move/detail/std_ns_end.hpp +2 -0
  1094. data/src/cxx_supportlib/vendor-modified/boost/move/detail/type_traits.hpp +263 -51
  1095. data/src/cxx_supportlib/vendor-modified/boost/move/detail/unique_ptr_meta_utils.hpp +0 -26
  1096. data/src/cxx_supportlib/vendor-modified/boost/move/detail/workaround.hpp +82 -3
  1097. data/src/cxx_supportlib/vendor-modified/boost/move/make_unique.hpp +10 -0
  1098. data/src/cxx_supportlib/vendor-modified/boost/move/unique_ptr.hpp +17 -18
  1099. data/src/cxx_supportlib/vendor-modified/boost/move/utility.hpp +2 -2
  1100. data/src/cxx_supportlib/vendor-modified/boost/move/utility_core.hpp +38 -33
  1101. data/src/cxx_supportlib/vendor-modified/boost/mp11/algorithm.hpp +1327 -0
  1102. data/src/cxx_supportlib/vendor-modified/boost/mp11/bind.hpp +111 -0
  1103. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/config.hpp +149 -0
  1104. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_append.hpp +321 -0
  1105. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_copy_if.hpp +48 -0
  1106. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_count.hpp +147 -0
  1107. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_defer.hpp +119 -0
  1108. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_fold.hpp +164 -0
  1109. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_front.hpp +50 -0
  1110. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_is_list.hpp +39 -0
  1111. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_is_value_list.hpp +41 -0
  1112. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_list.hpp +24 -0
  1113. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_list_v.hpp +27 -0
  1114. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_map_find.hpp +87 -0
  1115. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_min_element.hpp +51 -0
  1116. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_plus.hpp +84 -0
  1117. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_remove_if.hpp +48 -0
  1118. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_rename.hpp +54 -0
  1119. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_value.hpp +25 -0
  1120. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_void.hpp +32 -0
  1121. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_with_index.hpp +385 -0
  1122. data/src/cxx_supportlib/vendor-modified/boost/mp11/function.hpp +222 -0
  1123. data/src/cxx_supportlib/vendor-modified/boost/mp11/integer_sequence.hpp +112 -0
  1124. data/src/cxx_supportlib/vendor-modified/boost/mp11/integral.hpp +42 -0
  1125. data/src/cxx_supportlib/vendor-modified/boost/mp11/list.hpp +472 -0
  1126. data/src/cxx_supportlib/vendor-modified/boost/mp11/set.hpp +188 -0
  1127. data/src/cxx_supportlib/vendor-modified/boost/mp11/utility.hpp +169 -0
  1128. data/src/cxx_supportlib/vendor-modified/boost/mp11/version.hpp +16 -0
  1129. data/src/cxx_supportlib/vendor-modified/boost/mpl/and.hpp +1 -1
  1130. data/src/cxx_supportlib/vendor-modified/boost/mpl/assert.hpp +6 -6
  1131. data/src/cxx_supportlib/vendor-modified/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp +1 -1
  1132. data/src/cxx_supportlib/vendor-modified/boost/mpl/aux_/preprocessor/enum.hpp +12 -0
  1133. data/src/cxx_supportlib/vendor-modified/boost/mpl/aux_/preprocessor/params.hpp +12 -0
  1134. data/src/cxx_supportlib/vendor-modified/boost/mpl/aux_/template_arity.hpp +1 -1
  1135. data/src/cxx_supportlib/vendor-modified/boost/mpl/aux_/yes_no.hpp +2 -1
  1136. data/src/cxx_supportlib/vendor-modified/boost/mpl/bitand.hpp +1 -1
  1137. data/src/cxx_supportlib/vendor-modified/boost/mpl/bitor.hpp +1 -1
  1138. data/src/cxx_supportlib/vendor-modified/boost/mpl/has_xxx.hpp +2 -2
  1139. data/src/cxx_supportlib/vendor-modified/boost/mpl/or.hpp +1 -1
  1140. data/src/cxx_supportlib/vendor-modified/boost/mpl/string.hpp +6 -6
  1141. data/src/cxx_supportlib/vendor-modified/boost/next_prior.hpp +3 -44
  1142. data/src/cxx_supportlib/vendor-modified/boost/nondet_random.hpp +22 -0
  1143. data/src/cxx_supportlib/vendor-modified/boost/none.hpp +3 -4
  1144. data/src/cxx_supportlib/vendor-modified/boost/none_t.hpp +3 -1
  1145. data/src/cxx_supportlib/vendor-modified/boost/numeric/conversion/cast.hpp +1 -1
  1146. data/src/cxx_supportlib/vendor-modified/boost/numeric/conversion/converter_policies.hpp +4 -5
  1147. data/src/cxx_supportlib/vendor-modified/boost/numeric/conversion/detail/converter.hpp +1 -1
  1148. data/src/cxx_supportlib/vendor-modified/boost/numeric/conversion/detail/int_float_mixture.hpp +5 -5
  1149. data/src/cxx_supportlib/vendor-modified/boost/numeric/conversion/detail/meta.hpp +1 -1
  1150. data/src/cxx_supportlib/vendor-modified/boost/numeric/conversion/detail/sign_mixture.hpp +5 -5
  1151. data/src/cxx_supportlib/vendor-modified/boost/numeric/conversion/detail/udt_builtin_mixture.hpp +5 -5
  1152. data/src/cxx_supportlib/vendor-modified/boost/operators.hpp +2 -0
  1153. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/old_optional_implementation.hpp +5 -5
  1154. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_aligned_storage.hpp +1 -1
  1155. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_config.hpp +4 -4
  1156. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_hash.hpp +49 -0
  1157. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_reference_spec.hpp +10 -3
  1158. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_relops.hpp +1 -1
  1159. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_trivially_copyable_base.hpp +37 -26
  1160. data/src/cxx_supportlib/vendor-modified/boost/optional/optional.hpp +87 -26
  1161. data/src/cxx_supportlib/vendor-modified/boost/optional/optional_io.hpp +3 -2
  1162. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/arg_list.hpp +5 -5
  1163. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/default.hpp +11 -0
  1164. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/maybe.hpp +2 -2
  1165. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/name.hpp +1 -1
  1166. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/pack/item.hpp +2 -2
  1167. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/pack/make_arg_list.hpp +4 -4
  1168. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/pack/tag_keyword_arg_ref.hpp +4 -4
  1169. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/pack/unmatched_argument.hpp +1 -1
  1170. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/preprocessor/impl/function_cast.hpp +1 -1
  1171. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/preprocessor/impl/function_forward_match.hpp +1 -1
  1172. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/preprocessor/impl/specification.hpp +2 -2
  1173. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/preprocessor/is_binary.hpp +1 -1
  1174. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/preprocessor/is_nullary.hpp +1 -1
  1175. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/preprocessor/overloads.hpp +1 -1
  1176. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/set.hpp +1 -1
  1177. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/tag.hpp +6 -6
  1178. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/tagged_argument.hpp +12 -3
  1179. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/unwrap_cv_reference.hpp +4 -4
  1180. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/void.hpp +1 -1
  1181. data/src/cxx_supportlib/vendor-modified/boost/parameter/binding.hpp +3 -3
  1182. data/src/cxx_supportlib/vendor-modified/boost/parameter/config.hpp +1 -1
  1183. data/src/cxx_supportlib/vendor-modified/boost/parameter/macros.hpp +1 -1
  1184. data/src/cxx_supportlib/vendor-modified/boost/parameter/match.hpp +2 -2
  1185. data/src/cxx_supportlib/vendor-modified/boost/parameter/parameters.hpp +6 -6
  1186. data/src/cxx_supportlib/vendor-modified/boost/parameter/template_keyword.hpp +1 -1
  1187. data/src/cxx_supportlib/vendor-modified/boost/parameter/value_type.hpp +3 -3
  1188. data/src/cxx_supportlib/vendor-modified/boost/pool/object_pool.hpp +2 -2
  1189. data/src/cxx_supportlib/vendor-modified/boost/pool/pool.hpp +22 -9
  1190. data/src/cxx_supportlib/vendor-modified/boost/pool/pool_alloc.hpp +1 -1
  1191. data/src/cxx_supportlib/vendor-modified/boost/pool/simple_segregated_storage.hpp +13 -0
  1192. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/alpha.h +5 -0
  1193. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/arm.h +10 -0
  1194. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/blackfin.h +5 -0
  1195. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/convex.h +5 -0
  1196. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/e2k.h +54 -0
  1197. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/ia64.h +5 -0
  1198. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/loongarch.h +41 -0
  1199. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/m68k.h +5 -0
  1200. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/mips.h +10 -0
  1201. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/parisc.h +5 -0
  1202. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/ppc.h +55 -4
  1203. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/ptx.h +5 -0
  1204. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/pyramid.h +5 -0
  1205. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/riscv.h +5 -0
  1206. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/rs6k.h +10 -0
  1207. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/sparc.h +14 -2
  1208. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/superh.h +13 -0
  1209. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/sys370.h +5 -0
  1210. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/sys390.h +5 -0
  1211. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/x86/32.h +5 -0
  1212. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/x86/64.h +7 -2
  1213. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/z.h +5 -0
  1214. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture.h +2 -1
  1215. data/src/cxx_supportlib/vendor-modified/boost/predef/language/stdc.h +1 -1
  1216. data/src/cxx_supportlib/vendor-modified/boost/predef/language/stdcpp.h +2 -2
  1217. data/src/cxx_supportlib/vendor-modified/boost/predef/library/std/cxx.h +1 -1
  1218. data/src/cxx_supportlib/vendor-modified/boost/predef/library/std/stdcpp3.h +1 -1
  1219. data/src/cxx_supportlib/vendor-modified/boost/predef/make.h +4 -0
  1220. data/src/cxx_supportlib/vendor-modified/boost/predef/os/bsd/bsdi.h +1 -0
  1221. data/src/cxx_supportlib/vendor-modified/boost/predef/os/bsd/dragonfly.h +1 -0
  1222. data/src/cxx_supportlib/vendor-modified/boost/predef/os/bsd/free.h +1 -0
  1223. data/src/cxx_supportlib/vendor-modified/boost/predef/os/bsd/net.h +1 -0
  1224. data/src/cxx_supportlib/vendor-modified/boost/predef/os/bsd/open.h +1 -0
  1225. data/src/cxx_supportlib/vendor-modified/boost/predef/other/endian.h +8 -10
  1226. data/src/cxx_supportlib/vendor-modified/boost/predef/other/wordsize.h +73 -0
  1227. data/src/cxx_supportlib/vendor-modified/boost/predef/other.h +3 -2
  1228. data/src/cxx_supportlib/vendor-modified/boost/predef/platform.h +0 -1
  1229. data/src/cxx_supportlib/vendor-modified/boost/predef/version.h +1 -1
  1230. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/arithmetic/add.hpp +54 -1
  1231. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/arithmetic/dec.hpp +33 -0
  1232. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/arithmetic/detail/is_1_number.hpp +21 -0
  1233. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/arithmetic/detail/is_maximum_number.hpp +22 -0
  1234. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/arithmetic/detail/is_minimum_number.hpp +21 -0
  1235. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/arithmetic/detail/maximum_number.hpp +19 -0
  1236. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/arithmetic/div.hpp +37 -1
  1237. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/arithmetic/inc.hpp +33 -0
  1238. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/arithmetic/limits/dec_1024.hpp +531 -0
  1239. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/arithmetic/limits/dec_256.hpp +276 -0
  1240. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/arithmetic/limits/dec_512.hpp +275 -0
  1241. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/arithmetic/limits/inc_1024.hpp +536 -0
  1242. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/arithmetic/limits/inc_256.hpp +275 -0
  1243. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/arithmetic/limits/inc_512.hpp +280 -0
  1244. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/arithmetic/mod.hpp +37 -1
  1245. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/arithmetic/mul.hpp +60 -1
  1246. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/arithmetic/sub.hpp +51 -1
  1247. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/array/detail/get_data.hpp +1 -1
  1248. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/array/enum.hpp +17 -1
  1249. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/array/insert.hpp +71 -0
  1250. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/array/remove.hpp +66 -0
  1251. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/array/replace.hpp +58 -0
  1252. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/comparison/limits/not_equal_1024.hpp +1044 -0
  1253. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/comparison/limits/not_equal_256.hpp +793 -0
  1254. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/comparison/limits/not_equal_512.hpp +532 -0
  1255. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/comparison/not_equal.hpp +44 -1
  1256. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/config/config.hpp +16 -33
  1257. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/config/limits.hpp +136 -3
  1258. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/control/deduce_d.hpp +27 -0
  1259. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/control/detail/dmc/while.hpp +2 -3
  1260. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/control/detail/edg/limits/while_1024.hpp +1044 -0
  1261. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/control/detail/edg/limits/while_256.hpp +533 -0
  1262. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/control/detail/edg/limits/while_512.hpp +532 -0
  1263. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/control/detail/edg/while.hpp +27 -0
  1264. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/control/detail/limits/while_1024.hpp +1044 -0
  1265. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/control/detail/limits/while_256.hpp +533 -0
  1266. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/control/detail/limits/while_512.hpp +532 -0
  1267. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/control/detail/while.hpp +27 -0
  1268. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/control/limits/while_1024.hpp +531 -0
  1269. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/control/limits/while_256.hpp +275 -0
  1270. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/control/limits/while_512.hpp +275 -0
  1271. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/control/while.hpp +75 -0
  1272. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/detail/auto_rec.hpp +41 -0
  1273. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/detail/dmc/auto_rec.hpp +2 -2
  1274. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/detail/limits/auto_rec_1024.hpp +532 -0
  1275. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/detail/limits/auto_rec_256.hpp +280 -0
  1276. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/detail/limits/auto_rec_512.hpp +276 -0
  1277. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/facilities/intercept.hpp +29 -0
  1278. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/facilities/is_empty.hpp +0 -37
  1279. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/facilities/is_empty_variadic.hpp +0 -4
  1280. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/facilities/limits/intercept_1024.hpp +530 -0
  1281. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/facilities/limits/intercept_256.hpp +273 -0
  1282. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/facilities/limits/intercept_512.hpp +274 -0
  1283. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/facilities/overload.hpp +1 -3
  1284. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/forward1.hpp +27 -0
  1285. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/forward2.hpp +27 -0
  1286. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/forward3.hpp +27 -0
  1287. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/forward4.hpp +27 -0
  1288. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/forward5.hpp +27 -0
  1289. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/forward1_1024.hpp +2573 -0
  1290. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/forward1_256.hpp +1296 -0
  1291. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/forward1_512.hpp +1293 -0
  1292. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/forward2_1024.hpp +2573 -0
  1293. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/forward2_256.hpp +1296 -0
  1294. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/forward2_512.hpp +1293 -0
  1295. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/forward3_1024.hpp +2573 -0
  1296. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/forward3_256.hpp +1296 -0
  1297. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/forward3_512.hpp +1293 -0
  1298. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/forward4_1024.hpp +2573 -0
  1299. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/forward4_256.hpp +1296 -0
  1300. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/forward4_512.hpp +1293 -0
  1301. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/forward5_1024.hpp +2573 -0
  1302. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/forward5_256.hpp +1296 -0
  1303. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/forward5_512.hpp +1293 -0
  1304. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/reverse1_1024.hpp +2571 -0
  1305. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/reverse1_256.hpp +1296 -0
  1306. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/reverse1_512.hpp +1291 -0
  1307. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/reverse2_1024.hpp +2571 -0
  1308. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/reverse2_256.hpp +1296 -0
  1309. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/reverse2_512.hpp +1293 -0
  1310. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/reverse3_1024.hpp +2571 -0
  1311. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/reverse3_256.hpp +1296 -0
  1312. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/reverse3_512.hpp +1293 -0
  1313. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/reverse4_1024.hpp +2571 -0
  1314. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/reverse4_256.hpp +1296 -0
  1315. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/reverse4_512.hpp +1293 -0
  1316. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/reverse5_1024.hpp +2571 -0
  1317. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/reverse5_256.hpp +1296 -0
  1318. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/limits/reverse5_512.hpp +1293 -0
  1319. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/reverse1.hpp +25 -0
  1320. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/reverse2.hpp +25 -0
  1321. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/reverse3.hpp +25 -0
  1322. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/reverse4.hpp +25 -0
  1323. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/iter/reverse5.hpp +25 -0
  1324. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/limits/local_1024.hpp +1549 -0
  1325. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/limits/local_256.hpp +782 -0
  1326. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/limits/local_512.hpp +781 -0
  1327. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/limits/rlocal_1024.hpp +1549 -0
  1328. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/limits/rlocal_256.hpp +782 -0
  1329. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/limits/rlocal_512.hpp +781 -0
  1330. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/local.hpp +27 -0
  1331. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/iteration/detail/rlocal.hpp +25 -0
  1332. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/detail/dmc/fold_left.hpp +3 -2
  1333. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/detail/edg/fold_left.hpp +28 -0
  1334. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/detail/edg/fold_right.hpp +29 -0
  1335. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/detail/edg/limits/fold_left_1024.hpp +1044 -0
  1336. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/detail/edg/limits/fold_left_256.hpp +533 -0
  1337. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/detail/edg/limits/fold_left_512.hpp +532 -0
  1338. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/detail/edg/limits/fold_right_1024.hpp +1557 -0
  1339. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/detail/edg/limits/fold_right_256.hpp +791 -0
  1340. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/detail/edg/limits/fold_right_512.hpp +789 -0
  1341. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/detail/fold_left.hpp +28 -0
  1342. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/detail/fold_right.hpp +26 -0
  1343. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/detail/limits/fold_left_1024.hpp +532 -0
  1344. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/detail/limits/fold_left_256.hpp +275 -0
  1345. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/detail/limits/fold_left_512.hpp +276 -0
  1346. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/detail/limits/fold_right_1024.hpp +532 -0
  1347. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/detail/limits/fold_right_256.hpp +275 -0
  1348. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/detail/limits/fold_right_512.hpp +276 -0
  1349. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/enum.hpp +13 -1
  1350. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/fold_left.hpp +60 -0
  1351. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/fold_right.hpp +44 -0
  1352. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/for_each_product.hpp +25 -6
  1353. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/limits/fold_left_1024.hpp +531 -0
  1354. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/limits/fold_left_256.hpp +275 -0
  1355. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/limits/fold_left_512.hpp +275 -0
  1356. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/reverse.hpp +35 -0
  1357. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/size.hpp +56 -1
  1358. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/list/to_array.hpp +5 -72
  1359. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/logical/bool.hpp +22 -0
  1360. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/logical/limits/bool_1024.hpp +531 -0
  1361. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/logical/limits/bool_256.hpp +275 -0
  1362. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/logical/limits/bool_512.hpp +275 -0
  1363. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/punctuation/is_begin_parens.hpp +1 -5
  1364. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/punctuation/remove_parens.hpp +0 -4
  1365. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/repetition/deduce_r.hpp +27 -0
  1366. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/repetition/detail/dmc/for.hpp +3 -2
  1367. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/repetition/detail/edg/for.hpp +26 -0
  1368. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/repetition/detail/edg/limits/for_1024.hpp +1044 -0
  1369. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/repetition/detail/edg/limits/for_256.hpp +533 -0
  1370. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/repetition/detail/edg/limits/for_512.hpp +532 -0
  1371. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/repetition/detail/for.hpp +28 -0
  1372. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/repetition/detail/limits/for_1024.hpp +1044 -0
  1373. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/repetition/detail/limits/for_256.hpp +533 -0
  1374. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/repetition/detail/limits/for_512.hpp +532 -0
  1375. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/repetition/detail/msvc/for.hpp +1 -0
  1376. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/repetition/for.hpp +114 -0
  1377. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/repetition/limits/for_1024.hpp +531 -0
  1378. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/repetition/limits/for_256.hpp +275 -0
  1379. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/repetition/limits/for_512.hpp +275 -0
  1380. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/repetition/limits/repeat_1024.hpp +1557 -0
  1381. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/repetition/limits/repeat_256.hpp +791 -0
  1382. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/repetition/limits/repeat_512.hpp +789 -0
  1383. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/repetition/repeat.hpp +22 -0
  1384. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/repetition/repeat_from_to.hpp +27 -0
  1385. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/detail/binary_transform.hpp +6 -11
  1386. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/detail/limits/split_1024.hpp +530 -0
  1387. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/detail/limits/split_256.hpp +272 -0
  1388. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/detail/limits/split_512.hpp +274 -0
  1389. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/detail/split.hpp +23 -0
  1390. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/elem.hpp +23 -0
  1391. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/enum.hpp +23 -0
  1392. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/fold_left.hpp +52 -0
  1393. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/fold_right.hpp +37 -0
  1394. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/limits/elem_1024.hpp +530 -0
  1395. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/limits/elem_256.hpp +272 -0
  1396. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/limits/elem_512.hpp +274 -0
  1397. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/limits/enum_1024.hpp +530 -0
  1398. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/limits/enum_256.hpp +272 -0
  1399. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/limits/enum_512.hpp +274 -0
  1400. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/limits/fold_left_1024.hpp +1556 -0
  1401. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/limits/fold_left_256.hpp +1053 -0
  1402. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/limits/fold_left_512.hpp +788 -0
  1403. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/limits/fold_right_1024.hpp +530 -0
  1404. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/limits/fold_right_256.hpp +273 -0
  1405. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/limits/fold_right_512.hpp +274 -0
  1406. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/limits/size_1024.hpp +1043 -0
  1407. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/limits/size_256.hpp +532 -0
  1408. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/limits/size_512.hpp +531 -0
  1409. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/rest_n.hpp +9 -3
  1410. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/size.hpp +23 -0
  1411. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/variadic_seq_to_seq.hpp +0 -2
  1412. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/stringize.hpp +0 -4
  1413. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/detail/is_single_return.hpp +2 -2
  1414. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/eat.hpp +4 -18
  1415. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/elem.hpp +11 -157
  1416. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/insert.hpp +0 -5
  1417. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/limits/reverse_128.hpp +403 -0
  1418. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/limits/reverse_256.hpp +1171 -0
  1419. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/limits/reverse_64.hpp +83 -0
  1420. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/limits/to_list_128.hpp +595 -0
  1421. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/limits/to_list_256.hpp +1747 -0
  1422. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/limits/to_list_64.hpp +83 -0
  1423. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/limits/to_seq_128.hpp +403 -0
  1424. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/limits/to_seq_256.hpp +1171 -0
  1425. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/limits/to_seq_64.hpp +84 -0
  1426. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/pop_back.hpp +0 -5
  1427. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/pop_front.hpp +0 -5
  1428. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/push_back.hpp +0 -5
  1429. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/push_front.hpp +0 -6
  1430. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/rem.hpp +17 -39
  1431. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/remove.hpp +0 -5
  1432. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/replace.hpp +0 -5
  1433. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/reverse.hpp +38 -25
  1434. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/size.hpp +13 -6
  1435. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/to_array.hpp +15 -12
  1436. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/to_list.hpp +37 -25
  1437. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/to_seq.hpp +38 -24
  1438. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/variadic/detail/has_opt.hpp +1 -1
  1439. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/variadic/detail/is_single_return.hpp +2 -2
  1440. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/variadic/elem.hpp +93 -71
  1441. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/variadic/has_opt.hpp +7 -3
  1442. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/variadic/limits/elem_128.hpp +275 -0
  1443. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/variadic/limits/elem_256.hpp +723 -0
  1444. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/variadic/limits/elem_64.hpp +81 -0
  1445. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/variadic/limits/size_128.hpp +47 -0
  1446. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/variadic/limits/size_256.hpp +53 -0
  1447. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/variadic/limits/size_64.hpp +23 -0
  1448. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/variadic/size.hpp +39 -4
  1449. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/variadic/to_array.hpp +15 -9
  1450. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/variadic/to_list.hpp +9 -2
  1451. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/variadic/to_seq.hpp +1 -3
  1452. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/variadic/to_tuple.hpp +1 -3
  1453. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/wstringize.hpp +0 -4
  1454. data/src/cxx_supportlib/vendor-modified/boost/random/additive_combine.hpp +2 -2
  1455. data/src/cxx_supportlib/vendor-modified/boost/random/detail/gray_coded_qrng.hpp +29 -5
  1456. data/src/cxx_supportlib/vendor-modified/boost/random/detail/int_float_pair.hpp +3 -4
  1457. data/src/cxx_supportlib/vendor-modified/boost/random/detail/mixmax_skip_N17.ipp +287 -0
  1458. data/src/cxx_supportlib/vendor-modified/boost/random/detail/niederreiter_base2_table.hpp +1 -0
  1459. data/src/cxx_supportlib/vendor-modified/boost/random/detail/operators.hpp +1 -1
  1460. data/src/cxx_supportlib/vendor-modified/boost/random/detail/qrng_base.hpp +5 -5
  1461. data/src/cxx_supportlib/vendor-modified/boost/random/detail/seed.hpp +9 -11
  1462. data/src/cxx_supportlib/vendor-modified/boost/random/detail/seed_impl.hpp +13 -14
  1463. data/src/cxx_supportlib/vendor-modified/boost/random/detail/sobol_table.hpp +1 -0
  1464. data/src/cxx_supportlib/vendor-modified/boost/random/discard_block.hpp +2 -2
  1465. data/src/cxx_supportlib/vendor-modified/boost/random/generate_canonical.hpp +2 -3
  1466. data/src/cxx_supportlib/vendor-modified/boost/random/hyperexponential_distribution.hpp +3 -3
  1467. data/src/cxx_supportlib/vendor-modified/boost/random/independent_bits.hpp +3 -3
  1468. data/src/cxx_supportlib/vendor-modified/boost/random/inversive_congruential.hpp +2 -3
  1469. data/src/cxx_supportlib/vendor-modified/boost/random/lagged_fibonacci.hpp +4 -4
  1470. data/src/cxx_supportlib/vendor-modified/boost/random/linear_congruential.hpp +5 -7
  1471. data/src/cxx_supportlib/vendor-modified/boost/random/linear_feedback_shift.hpp +3 -3
  1472. data/src/cxx_supportlib/vendor-modified/boost/random/mersenne_twister.hpp +2 -2
  1473. data/src/cxx_supportlib/vendor-modified/boost/random/mixmax.hpp +313 -0
  1474. data/src/cxx_supportlib/vendor-modified/boost/random/niederreiter_base2.hpp +2 -2
  1475. data/src/cxx_supportlib/vendor-modified/boost/random/random_device.hpp +2 -2
  1476. data/src/cxx_supportlib/vendor-modified/boost/random/shuffle_order.hpp +2 -2
  1477. data/src/cxx_supportlib/vendor-modified/boost/random/sobol.hpp +3 -2
  1478. data/src/cxx_supportlib/vendor-modified/boost/random/subtract_with_carry.hpp +4 -4
  1479. data/src/cxx_supportlib/vendor-modified/boost/random/traits.hpp +3 -3
  1480. data/src/cxx_supportlib/vendor-modified/boost/random/uniform_int_distribution.hpp +7 -7
  1481. data/src/cxx_supportlib/vendor-modified/boost/random/uniform_real_distribution.hpp +2 -3
  1482. data/src/cxx_supportlib/vendor-modified/boost/random/uniform_smallint.hpp +4 -5
  1483. data/src/cxx_supportlib/vendor-modified/boost/random/xor_combine.hpp +4 -2
  1484. data/src/cxx_supportlib/vendor-modified/boost/random.hpp +1 -0
  1485. data/src/cxx_supportlib/vendor-modified/boost/ratio/config.hpp +7 -2
  1486. data/src/cxx_supportlib/vendor-modified/boost/ratio/detail/requires_cxx11.hpp +22 -0
  1487. data/src/cxx_supportlib/vendor-modified/boost/ratio/mpl/plus.hpp +1 -1
  1488. data/src/cxx_supportlib/vendor-modified/boost/rational.hpp +7 -7
  1489. data/src/cxx_supportlib/vendor-modified/boost/regex/concepts.hpp +79 -74
  1490. data/src/cxx_supportlib/vendor-modified/boost/regex/config.hpp +97 -113
  1491. data/src/cxx_supportlib/vendor-modified/boost/regex/pattern_except.hpp +4 -75
  1492. data/src/cxx_supportlib/vendor-modified/boost/regex/pending/object_cache.hpp +4 -147
  1493. data/src/cxx_supportlib/vendor-modified/boost/regex/pending/unicode_iterator.hpp +8 -761
  1494. data/src/cxx_supportlib/vendor-modified/boost/regex/regex_traits.hpp +4 -0
  1495. data/src/cxx_supportlib/vendor-modified/boost/regex/user.hpp +2 -0
  1496. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/basic_regex.hpp +8 -9
  1497. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/basic_regex_creator.hpp +20 -19
  1498. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/basic_regex_parser.hpp +23 -13
  1499. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/c_regex_traits.hpp +342 -42
  1500. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/cpp_regex_traits.hpp +107 -24
  1501. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/cregex.hpp +0 -117
  1502. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/icu.hpp +1516 -0
  1503. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/match_flags.hpp +5 -5
  1504. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/match_results.hpp +8 -8
  1505. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/mem_block_cache.hpp +39 -1
  1506. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/object_cache.hpp +171 -0
  1507. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/pattern_except.hpp +128 -0
  1508. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher.hpp +13 -4
  1509. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher_common.hpp +1 -1
  1510. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher_non_recursive.hpp +40 -41
  1511. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher_recursive.hpp +6 -6
  1512. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/primary_transform.hpp +1 -1
  1513. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/protected_call.hpp +3 -1
  1514. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex.hpp +0 -36
  1515. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_format.hpp +3 -3
  1516. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_raw_buffer.hpp +35 -4
  1517. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_token_iterator.hpp +2 -0
  1518. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_traits_defaults.hpp +638 -22
  1519. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_workaround.hpp +7 -7
  1520. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/states.hpp +1 -1
  1521. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/unicode_iterator.hpp +871 -0
  1522. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/w32_regex_traits.hpp +521 -37
  1523. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/basic_regex.hpp +734 -0
  1524. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/basic_regex_creator.hpp +1576 -0
  1525. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/basic_regex_parser.hpp +3130 -0
  1526. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/c_regex_traits.hpp +474 -0
  1527. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/char_regex_traits.hpp +59 -0
  1528. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/cpp_regex_traits.hpp +1040 -0
  1529. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/cregex.hpp +195 -0
  1530. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/error_type.hpp +59 -0
  1531. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/icu.hpp +1402 -0
  1532. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/iterator_category.hpp +84 -0
  1533. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/iterator_traits.hpp +32 -0
  1534. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/match_flags.hpp +156 -0
  1535. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/match_results.hpp +667 -0
  1536. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/mem_block_cache.hpp +173 -0
  1537. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/object_cache.hpp +160 -0
  1538. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/pattern_except.hpp +106 -0
  1539. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/perl_matcher.hpp +576 -0
  1540. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/perl_matcher_common.hpp +921 -0
  1541. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/perl_matcher_non_recursive.hpp +1874 -0
  1542. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/primary_transform.hpp +120 -0
  1543. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regbase.hpp +158 -0
  1544. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex.hpp +106 -0
  1545. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_format.hpp +1124 -0
  1546. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_fwd.hpp +73 -0
  1547. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_grep.hpp +98 -0
  1548. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_iterator.hpp +173 -0
  1549. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_match.hpp +92 -0
  1550. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_merge.hpp +71 -0
  1551. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_raw_buffer.hpp +213 -0
  1552. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_replace.hpp +77 -0
  1553. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_search.hpp +103 -0
  1554. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_split.hpp +152 -0
  1555. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_token_iterator.hpp +255 -0
  1556. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_traits.hpp +130 -0
  1557. data/src/cxx_supportlib/vendor-modified/boost/{libs/regex/src/regex_traits_defaults.cpp → regex/v5/regex_traits_defaults.hpp} +719 -415
  1558. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_workaround.hpp +159 -0
  1559. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/states.hpp +299 -0
  1560. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/sub_match.hpp +382 -0
  1561. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/syntax_type.hpp +105 -0
  1562. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/u32regex_iterator.hpp +177 -0
  1563. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/u32regex_token_iterator.hpp +312 -0
  1564. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/unicode_iterator.hpp +862 -0
  1565. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/w32_regex_traits.hpp +1311 -0
  1566. data/src/cxx_supportlib/vendor-modified/boost/regex.hpp +4 -0
  1567. data/src/cxx_supportlib/vendor-modified/boost/regex_fwd.hpp +4 -0
  1568. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/allocate_shared_array.hpp +1 -0
  1569. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/requires_cxx11.hpp +23 -0
  1570. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/shared_count.hpp +2 -2
  1571. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp +4 -2
  1572. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_atomic.hpp +1 -1
  1573. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_impl.hpp +23 -3
  1574. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/spinlock_gcc_atomic.hpp +11 -2
  1575. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/yield_k.hpp +4 -6
  1576. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/enable_shared_from_this.hpp +1 -0
  1577. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/intrusive_ptr.hpp +3 -1
  1578. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/make_shared.hpp +1 -0
  1579. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/make_shared_array.hpp +1 -0
  1580. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/make_shared_object.hpp +1 -0
  1581. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/scoped_array.hpp +2 -1
  1582. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/scoped_ptr.hpp +2 -1
  1583. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/shared_array.hpp +3 -1
  1584. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/shared_ptr.hpp +63 -7
  1585. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/weak_ptr.hpp +1 -0
  1586. data/src/cxx_supportlib/vendor-modified/boost/static_assert.hpp +3 -2
  1587. data/src/cxx_supportlib/vendor-modified/boost/system/detail/append_int.hpp +32 -0
  1588. data/src/cxx_supportlib/vendor-modified/boost/system/detail/cerrno.hpp +329 -0
  1589. data/src/cxx_supportlib/vendor-modified/boost/system/detail/config.hpp +51 -12
  1590. data/src/cxx_supportlib/vendor-modified/boost/system/detail/enable_if.hpp +32 -0
  1591. data/src/cxx_supportlib/vendor-modified/boost/system/detail/errc.hpp +126 -0
  1592. data/src/cxx_supportlib/vendor-modified/boost/system/detail/error_category.hpp +227 -0
  1593. data/src/cxx_supportlib/vendor-modified/boost/system/detail/error_category_impl.hpp +190 -0
  1594. data/src/cxx_supportlib/vendor-modified/boost/system/detail/error_code.hpp +732 -0
  1595. data/src/cxx_supportlib/vendor-modified/boost/system/detail/error_condition.hpp +349 -0
  1596. data/src/cxx_supportlib/vendor-modified/boost/system/detail/generic_category.hpp +80 -58
  1597. data/src/cxx_supportlib/vendor-modified/boost/system/detail/generic_category_message.hpp +108 -0
  1598. data/src/cxx_supportlib/vendor-modified/boost/system/detail/interop_category.hpp +107 -0
  1599. data/src/cxx_supportlib/vendor-modified/boost/system/detail/is_same.hpp +33 -0
  1600. data/src/cxx_supportlib/vendor-modified/boost/system/detail/mutex.hpp +121 -0
  1601. data/src/cxx_supportlib/vendor-modified/boost/system/detail/requires_cxx11.hpp +21 -0
  1602. data/src/cxx_supportlib/vendor-modified/boost/system/detail/snprintf.hpp +73 -0
  1603. data/src/cxx_supportlib/vendor-modified/boost/system/detail/std_category.hpp +88 -0
  1604. data/src/cxx_supportlib/vendor-modified/boost/system/detail/std_category_impl.hpp +97 -0
  1605. data/src/cxx_supportlib/vendor-modified/boost/system/detail/system_category.hpp +110 -0
  1606. data/src/cxx_supportlib/vendor-modified/boost/system/detail/system_category_impl.hpp +61 -0
  1607. data/src/cxx_supportlib/vendor-modified/boost/system/detail/system_category_message.hpp +71 -0
  1608. data/src/cxx_supportlib/vendor-modified/boost/system/detail/throws.hpp +59 -0
  1609. data/src/cxx_supportlib/vendor-modified/boost/system/errc.hpp +57 -0
  1610. data/src/cxx_supportlib/vendor-modified/boost/system/error_category.hpp +13 -0
  1611. data/src/cxx_supportlib/vendor-modified/boost/system/error_code.hpp +7 -958
  1612. data/src/cxx_supportlib/vendor-modified/boost/system/error_condition.hpp +13 -0
  1613. data/src/cxx_supportlib/vendor-modified/boost/system/generic_category.hpp +13 -0
  1614. data/src/cxx_supportlib/vendor-modified/boost/system/is_error_code_enum.hpp +30 -0
  1615. data/src/cxx_supportlib/vendor-modified/boost/system/is_error_condition_enum.hpp +30 -0
  1616. data/src/cxx_supportlib/vendor-modified/boost/system/system_category.hpp +14 -0
  1617. data/src/cxx_supportlib/vendor-modified/boost/system/system_error.hpp +30 -59
  1618. data/src/cxx_supportlib/vendor-modified/boost/thread/detail/config.hpp +1 -1
  1619. data/src/cxx_supportlib/vendor-modified/boost/thread/detail/thread.hpp +26 -0
  1620. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/thread_data.hpp +1 -1
  1621. data/src/cxx_supportlib/vendor-modified/boost/thread/scoped_thread.hpp +9 -0
  1622. data/src/cxx_supportlib/vendor-modified/boost/thread/thread_guard.hpp +5 -0
  1623. data/src/cxx_supportlib/vendor-modified/boost/throw_exception.hpp +141 -45
  1624. data/src/cxx_supportlib/vendor-modified/boost/token_functions.hpp +2 -2
  1625. data/src/cxx_supportlib/vendor-modified/boost/tuple/detail/tuple_basic.hpp +22 -21
  1626. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/config.hpp +4 -1
  1627. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_function_cxx_11.hpp +247 -168
  1628. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_function_ptr_helper.hpp +27 -27
  1629. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_function_ptr_tester.hpp +27 -27
  1630. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_likely_lambda.hpp +1 -1
  1631. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_mem_fun_pointer_impl.hpp +27 -27
  1632. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_mem_fun_pointer_tester.hpp +27 -27
  1633. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_member_function_pointer_cxx_11.hpp +242 -217
  1634. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_swappable_cxx_11.hpp +70 -0
  1635. data/src/cxx_supportlib/vendor-modified/boost/type_traits/intrinsics.hpp +22 -8
  1636. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_complete.hpp +2 -1
  1637. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_convertible.hpp +1 -1
  1638. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_empty.hpp +1 -1
  1639. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_function.hpp +1 -1
  1640. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_integral.hpp +3 -0
  1641. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_member_function_pointer.hpp +1 -1
  1642. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_nothrow_swappable.hpp +4 -24
  1643. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_swappable.hpp +92 -0
  1644. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_trivially_copyable.hpp +4 -0
  1645. data/src/cxx_supportlib/vendor-modified/boost/type_traits/type_with_alignment.hpp +1 -1
  1646. data/src/cxx_supportlib/vendor-modified/boost/typeof/detail/requires_cxx11.hpp +18 -0
  1647. data/src/cxx_supportlib/vendor-modified/boost/typeof/modifiers.hpp +3 -3
  1648. data/src/cxx_supportlib/vendor-modified/boost/typeof/register_fundamental.hpp +2 -2
  1649. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/functional.hpp +6 -1
  1650. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/memory.hpp +6 -1
  1651. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/string.hpp +1 -1
  1652. data/src/cxx_supportlib/vendor-modified/boost/typeof/template_encoding.hpp +1 -1
  1653. data/src/cxx_supportlib/vendor-modified/boost/typeof/template_template_param.hpp +1 -1
  1654. data/src/cxx_supportlib/vendor-modified/boost/typeof/typeof.hpp +5 -4
  1655. data/src/cxx_supportlib/vendor-modified/boost/typeof/typeof_impl.hpp +1 -1
  1656. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map.hpp +818 -0
  1657. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map_fwd.hpp +54 -0
  1658. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/fca.hpp +849 -0
  1659. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/concurrent_table.hpp +1324 -0
  1660. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/core.hpp +2119 -0
  1661. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/element_type.hpp +60 -0
  1662. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/flat_map_types.hpp +73 -0
  1663. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/flat_set_types.hpp +44 -0
  1664. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/ignore_wshadow.hpp +35 -0
  1665. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/node_handle.hpp +210 -0
  1666. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/node_map_types.hpp +132 -0
  1667. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/node_set_types.hpp +95 -0
  1668. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/restore_wshadow.hpp +11 -0
  1669. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/rw_spinlock.hpp +179 -0
  1670. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/table.hpp +556 -0
  1671. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/tuple_rotate_right.hpp +52 -0
  1672. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/fwd.hpp +88 -1
  1673. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/implementation.hpp +1645 -2992
  1674. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/map.hpp +8 -14
  1675. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/mulx.hpp +129 -0
  1676. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/narrow_cast.hpp +44 -0
  1677. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/prime_fmod.hpp +263 -0
  1678. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/requires_cxx11.hpp +21 -0
  1679. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/set.hpp +8 -13
  1680. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/type_traits.hpp +122 -0
  1681. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/xmx.hpp +75 -0
  1682. data/src/cxx_supportlib/vendor-modified/boost/unordered/hash_traits.hpp +45 -0
  1683. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map.hpp +781 -0
  1684. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map_fwd.hpp +48 -0
  1685. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set.hpp +592 -0
  1686. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set_fwd.hpp +48 -0
  1687. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_map.hpp +666 -227
  1688. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_map_fwd.hpp +10 -2
  1689. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map.hpp +884 -0
  1690. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map_fwd.hpp +48 -0
  1691. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set.hpp +688 -0
  1692. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set_fwd.hpp +48 -0
  1693. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_set.hpp +387 -112
  1694. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_set_fwd.hpp +10 -2
  1695. data/src/cxx_supportlib/vendor-modified/boost/utility/base_from_member.hpp +2 -1
  1696. data/src/cxx_supportlib/vendor-modified/boost/utility/binary.hpp +3 -2
  1697. data/src/cxx_supportlib/vendor-modified/boost/utility/detail/result_of_variadic.hpp +190 -0
  1698. data/src/cxx_supportlib/vendor-modified/boost/utility/in_place_factory.hpp +6 -0
  1699. data/src/cxx_supportlib/vendor-modified/boost/utility/result_of.hpp +33 -11
  1700. data/src/cxx_supportlib/vendor-modified/boost/utility/string_ref.hpp +6 -2
  1701. data/src/cxx_supportlib/vendor-modified/boost/utility/string_view.hpp +27 -4
  1702. data/src/cxx_supportlib/vendor-modified/boost/utility/typed_in_place_factory.hpp +6 -1
  1703. data/src/cxx_supportlib/vendor-modified/boost/utility/value_init.hpp +5 -1
  1704. data/src/cxx_supportlib/vendor-modified/boost/version.hpp +2 -2
  1705. data/src/cxx_supportlib/vendor-modified/modp_b64_strict_aliasing.cpp +1 -1
  1706. data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/common/functional.hpp +2 -7
  1707. data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/common/md5.hpp +1 -1
  1708. data/src/helper-scripts/wsgi-loader.py +34 -17
  1709. data/src/nginx_module/ConfigGeneral/AutoGeneratedDefinitions.c +16 -0
  1710. data/src/nginx_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.c +12 -0
  1711. data/src/nginx_module/ConfigGeneral/AutoGeneratedSetterFuncs.c +24 -0
  1712. data/src/nginx_module/LocationConfig/AutoGeneratedCreateFunction.c +10 -0
  1713. data/src/nginx_module/LocationConfig/AutoGeneratedHeaderSerialization.c +39 -0
  1714. data/src/nginx_module/LocationConfig/AutoGeneratedManifestGeneration.c +26 -0
  1715. data/src/nginx_module/LocationConfig/AutoGeneratedMergeFunction.c +6 -0
  1716. data/src/nginx_module/LocationConfig/AutoGeneratedStruct.h +8 -0
  1717. data/src/nginx_module/ngx_http_passenger_module.c +1 -0
  1718. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/common.js +50 -29
  1719. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/config/cli-config.js +20 -20
  1720. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/config/npm-config.js +11 -11
  1721. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/config/syslog-config.js +3 -3
  1722. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/config.js +8 -2
  1723. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/container.js +2 -1
  1724. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/logger.js +174 -146
  1725. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/transports/console.js +4 -2
  1726. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/transports/file.js +15 -5
  1727. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/transports/http.js +14 -4
  1728. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/transports.js +26 -24
  1729. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston.js +5 -5
  1730. data/src/nodejs_supportlib/vendor-copy/winston/node_modules/async/package.json +4 -13
  1731. data/src/nodejs_supportlib/vendor-copy/winston/node_modules/colors/package.json +19 -33
  1732. data/src/nodejs_supportlib/vendor-copy/winston/node_modules/cycle/package.json +11 -29
  1733. data/src/nodejs_supportlib/vendor-copy/winston/node_modules/eyes/package.json +12 -40
  1734. data/src/nodejs_supportlib/vendor-copy/winston/node_modules/isstream/package.json +3 -12
  1735. data/src/nodejs_supportlib/vendor-copy/winston/node_modules/stack-trace/lib/stack-trace.js +49 -24
  1736. data/src/nodejs_supportlib/vendor-copy/winston/node_modules/stack-trace/package.json +4 -16
  1737. data/src/nodejs_supportlib/vendor-copy/winston/package.json +11 -55
  1738. data/src/ruby_native_extension/extconf.rb +1 -1
  1739. data/src/ruby_supportlib/phusion_passenger/admin_tools/instance_registry.rb +3 -2
  1740. data/src/ruby_supportlib/phusion_passenger/apache2/config_options.rb +6 -0
  1741. data/src/ruby_supportlib/phusion_passenger/config/nginx_engine_compiler.rb +3 -2
  1742. data/src/ruby_supportlib/phusion_passenger/config/restart_app_command.rb +16 -12
  1743. data/src/ruby_supportlib/phusion_passenger/console_text_template.rb +7 -2
  1744. data/src/ruby_supportlib/phusion_passenger/loader_shared_helpers.rb +11 -2
  1745. data/src/ruby_supportlib/phusion_passenger/native_support.rb +4 -2
  1746. data/src/ruby_supportlib/phusion_passenger/nginx/config_options.rb +12 -0
  1747. data/src/ruby_supportlib/phusion_passenger/packaging.rb +3 -1
  1748. data/src/ruby_supportlib/phusion_passenger/platform_info/apache.rb +6 -3
  1749. data/src/ruby_supportlib/phusion_passenger/platform_info/binary_compatibility.rb +23 -19
  1750. data/src/ruby_supportlib/phusion_passenger/platform_info/curl.rb +3 -0
  1751. data/src/ruby_supportlib/phusion_passenger/platform_info/cxx_portability.rb +1 -1
  1752. data/src/ruby_supportlib/phusion_passenger/platform_info/depcheck_specs/libs.rb +6 -2
  1753. data/src/ruby_supportlib/phusion_passenger/platform_info/linux.rb +2 -1
  1754. data/src/ruby_supportlib/phusion_passenger/platform_info/openssl.rb +5 -0
  1755. data/src/ruby_supportlib/phusion_passenger/platform_info/operating_system.rb +47 -28
  1756. data/src/ruby_supportlib/phusion_passenger/platform_info/pcre.rb +65 -0
  1757. data/src/ruby_supportlib/phusion_passenger/platform_info/ruby.rb +2 -2
  1758. data/src/ruby_supportlib/phusion_passenger/public_api.rb +3 -0
  1759. data/src/ruby_supportlib/phusion_passenger/rack/thread_handler_extension.rb +12 -1
  1760. data/src/ruby_supportlib/phusion_passenger/request_handler/thread_handler.rb +18 -18
  1761. data/src/ruby_supportlib/phusion_passenger/request_handler.rb +4 -1
  1762. data/src/ruby_supportlib/phusion_passenger/ruby_core_enhancements.rb +5 -0
  1763. data/src/ruby_supportlib/phusion_passenger/standalone/config_options_list.rb +7 -1
  1764. data/src/ruby_supportlib/phusion_passenger/standalone/start_command/builtin_engine.rb +1 -0
  1765. data/src/ruby_supportlib/phusion_passenger/standalone/start_command/nginx_engine.rb +28 -17
  1766. data/src/ruby_supportlib/phusion_passenger/utils.rb +1 -0
  1767. data/src/ruby_supportlib/phusion_passenger.rb +7 -7
  1768. metadata +577 -150
  1769. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactor_fwd.hpp +0 -42
  1770. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/compose.hpp +0 -637
  1771. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/src.cpp +0 -25
  1772. data/src/cxx_supportlib/vendor-modified/boost/bind.hpp +0 -60
  1773. data/src/cxx_supportlib/vendor-modified/boost/checked_delete.hpp +0 -17
  1774. data/src/cxx_supportlib/vendor-modified/boost/container_hash/detail/float_functions.hpp +0 -336
  1775. data/src/cxx_supportlib/vendor-modified/boost/container_hash/detail/hash_float.hpp +0 -271
  1776. data/src/cxx_supportlib/vendor-modified/boost/container_hash/detail/limits.hpp +0 -62
  1777. data/src/cxx_supportlib/vendor-modified/boost/container_hash/extensions.hpp +0 -363
  1778. data/src/cxx_supportlib/vendor-modified/boost/detail/container_fwd.hpp +0 -157
  1779. data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/c_regex_traits.cpp +0 -206
  1780. data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/cpp_regex_traits.cpp +0 -117
  1781. data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/cregex.cpp +0 -667
  1782. data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/instances.cpp +0 -32
  1783. data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/regex_raw_buffer.cpp +0 -72
  1784. data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/wc_regex_traits.cpp +0 -314
  1785. data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/winstances.cpp +0 -35
  1786. data/src/cxx_supportlib/vendor-modified/boost/math/policies/policy.hpp +0 -1038
  1787. data/src/cxx_supportlib/vendor-modified/boost/math/special_functions/detail/fp_traits.hpp +0 -581
  1788. data/src/cxx_supportlib/vendor-modified/boost/math/special_functions/detail/round_fwd.hpp +0 -93
  1789. data/src/cxx_supportlib/vendor-modified/boost/math/special_functions/fpclassify.hpp +0 -640
  1790. data/src/cxx_supportlib/vendor-modified/boost/math/special_functions/math_fwd.hpp +0 -1712
  1791. data/src/cxx_supportlib/vendor-modified/boost/math/special_functions/sign.hpp +0 -194
  1792. data/src/cxx_supportlib/vendor-modified/boost/math/tools/config.hpp +0 -489
  1793. data/src/cxx_supportlib/vendor-modified/boost/math/tools/promotion.hpp +0 -182
  1794. data/src/cxx_supportlib/vendor-modified/boost/math/tools/real_cast.hpp +0 -31
  1795. data/src/cxx_supportlib/vendor-modified/boost/math/tools/user.hpp +0 -105
  1796. data/src/cxx_supportlib/vendor-modified/boost/pointer_to_other.hpp +0 -55
  1797. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/fileiter.hpp +0 -557
  1798. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/instances.hpp +0 -236
  1799. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_thread_pause.hpp +0 -51
  1800. data/src/cxx_supportlib/vendor-modified/boost/system/detail/std_interoperability.hpp +0 -182
  1801. data/src/cxx_supportlib/vendor-modified/boost/system/detail/system_category_posix.hpp +0 -132
  1802. data/src/cxx_supportlib/vendor-modified/boost/thread/detail/thread.hpp.orig +0 -841
  1803. data/src/cxx_supportlib/vendor-modified/boost/thread/once.hpp.orig +0 -54
  1804. data/src/cxx_supportlib/vendor-modified/boost/type_index/stl_type_index.hpp +0 -278
  1805. data/src/cxx_supportlib/vendor-modified/boost/type_index/type_index_facade.hpp +0 -297
  1806. data/src/cxx_supportlib/vendor-modified/boost/type_index.hpp +0 -265
  1807. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/transports/daily-rotate-file.js +0 -601
  1808. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/transports/webhook.js +0 -146
  1809. data/src/nodejs_supportlib/vendor-copy/winston/node_modules/pkginfo/LICENSE +0 -19
  1810. data/src/nodejs_supportlib/vendor-copy/winston/node_modules/pkginfo/lib/pkginfo.js +0 -136
  1811. data/src/nodejs_supportlib/vendor-copy/winston/node_modules/pkginfo/package.json +0 -56
  1812. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/COPYING +0 -0
  1813. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/changelog.md +0 -0
  1814. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/readme.md +0 -0
  1815. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/base64/base64.hpp +0 -0
  1816. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/client.hpp +0 -0
  1817. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/close.hpp +0 -0
  1818. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/common/asio.hpp +0 -0
  1819. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/common/asio_ssl.hpp +0 -0
  1820. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/common/chrono.hpp +0 -0
  1821. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/common/connection_hdl.hpp +0 -0
  1822. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/common/cpp11.hpp +0 -0
  1823. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/common/memory.hpp +0 -0
  1824. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/common/network.hpp +0 -0
  1825. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/common/platforms.hpp +0 -0
  1826. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/common/random.hpp +0 -0
  1827. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/common/regex.hpp +0 -0
  1828. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/common/stdint.hpp +0 -0
  1829. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/common/system_error.hpp +0 -0
  1830. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/common/thread.hpp +0 -0
  1831. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/common/time.hpp +0 -0
  1832. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/common/type_traits.hpp +0 -0
  1833. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/concurrency/basic.hpp +0 -0
  1834. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/concurrency/none.hpp +0 -0
  1835. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/config/asio.hpp +0 -0
  1836. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/config/asio_client.hpp +0 -0
  1837. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/config/asio_no_tls.hpp +0 -0
  1838. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/config/asio_no_tls_client.hpp +0 -0
  1839. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/config/boost_config.hpp +0 -0
  1840. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/config/core.hpp +0 -0
  1841. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/config/core_client.hpp +0 -0
  1842. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/config/debug.hpp +0 -0
  1843. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/config/debug_asio.hpp +0 -0
  1844. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/config/debug_asio_no_tls.hpp +0 -0
  1845. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/config/minimal_client.hpp +0 -0
  1846. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/config/minimal_server.hpp +0 -0
  1847. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/connection.hpp +0 -0
  1848. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/connection_base.hpp +0 -0
  1849. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/endpoint.hpp +0 -0
  1850. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/endpoint_base.hpp +0 -0
  1851. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/error.hpp +0 -0
  1852. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/extensions/extension.hpp +0 -0
  1853. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/extensions/permessage_deflate/disabled.hpp +0 -0
  1854. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/extensions/permessage_deflate/enabled.hpp +0 -0
  1855. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/frame.hpp +0 -0
  1856. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/http/constants.hpp +0 -0
  1857. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/http/impl/parser.hpp +0 -0
  1858. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/http/impl/request.hpp +0 -0
  1859. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/http/impl/response.hpp +0 -0
  1860. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/http/parser.hpp +0 -0
  1861. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/http/request.hpp +0 -0
  1862. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/http/response.hpp +0 -0
  1863. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/impl/connection_impl.hpp +0 -0
  1864. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/impl/endpoint_impl.hpp +0 -0
  1865. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/impl/utilities_impl.hpp +0 -0
  1866. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/logger/basic.hpp +0 -0
  1867. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/logger/levels.hpp +0 -0
  1868. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/logger/stub.hpp +0 -0
  1869. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/logger/syslog.hpp +0 -0
  1870. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/message_buffer/alloc.hpp +0 -0
  1871. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/message_buffer/message.hpp +0 -0
  1872. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/message_buffer/pool.hpp +0 -0
  1873. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/processors/base.hpp +0 -0
  1874. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/processors/hybi00.hpp +0 -0
  1875. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/processors/hybi07.hpp +0 -0
  1876. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/processors/hybi08.hpp +0 -0
  1877. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/processors/hybi13.hpp +0 -0
  1878. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/processors/processor.hpp +0 -0
  1879. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/random/none.hpp +0 -0
  1880. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/random/random_device.hpp +0 -0
  1881. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/roles/client_endpoint.hpp +0 -0
  1882. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/roles/server_endpoint.hpp +0 -0
  1883. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/server.hpp +0 -0
  1884. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/sha1/sha1.hpp +0 -0
  1885. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/transport/asio/base.hpp +0 -0
  1886. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/transport/asio/connection.hpp +0 -0
  1887. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/transport/asio/endpoint.hpp +0 -0
  1888. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/transport/asio/security/base.hpp +0 -0
  1889. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/transport/asio/security/none.hpp +0 -0
  1890. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/transport/asio/security/tls.hpp +0 -0
  1891. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/transport/base/connection.hpp +0 -0
  1892. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/transport/base/endpoint.hpp +0 -0
  1893. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/transport/debug/base.hpp +0 -0
  1894. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/transport/debug/connection.hpp +0 -0
  1895. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/transport/debug/endpoint.hpp +0 -0
  1896. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/transport/iostream/base.hpp +0 -0
  1897. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/transport/iostream/connection.hpp +0 -0
  1898. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/transport/iostream/endpoint.hpp +0 -0
  1899. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/transport/stub/base.hpp +0 -0
  1900. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/transport/stub/connection.hpp +0 -0
  1901. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/transport/stub/endpoint.hpp +0 -0
  1902. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/uri.hpp +0 -0
  1903. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/utf8_validator.hpp +0 -0
  1904. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/utilities.hpp +0 -0
  1905. /data/src/cxx_supportlib/{vendor-copy → vendor-modified}/websocketpp/websocketpp/version.hpp +0 -0
@@ -1,6 +1,8 @@
1
1
  /////////////////////////////////////////////////////////////////////////////
2
2
  //
3
- // (C) Copyright Ion Gaztanaga 2006-2015
3
+ // (C) Copyright Ion Gaztanaga 2006-2022
4
+ // (C) Copyright 2022 Joaquin M Lopez Munoz.
5
+ // (C) Copyright 2022 Christian Mazakas
4
6
  //
5
7
  // Distributed under the Boost Software License, Version 1.0.
6
8
  // (See accompanying file LICENSE_1_0.txt or copy at
@@ -9,6 +11,21 @@
9
11
  // See http://www.boost.org/libs/intrusive for documentation.
10
12
  //
11
13
  /////////////////////////////////////////////////////////////////////////////
14
+
15
+ // fastmod_buckets option is implemented reusing parts of Joaquin M. Lopez
16
+ // Munoz's "fxa_unordered" library (proof of concept of closed- and
17
+ // open-addressing unordered associative containers), released under
18
+ // Boost Software License:
19
+ //
20
+ // https://github.com/joaquintides/fxa_unordered/
21
+ //
22
+ // On cases and systems that can't take advantage of Daniel Lemire's
23
+ // "fastmod" (https://github.com/lemire/fastmod) approach,
24
+ // precomputed divisions are used.
25
+ //
26
+ // As always, thanks Joaquin for your great work!
27
+
28
+
12
29
  #ifndef BOOST_INTRUSIVE_HASHTABLE_HPP
13
30
  #define BOOST_INTRUSIVE_HASHTABLE_HPP
14
31
 
@@ -27,41 +44,336 @@
27
44
  #include <boost/intrusive/detail/simple_disposers.hpp>
28
45
  #include <boost/intrusive/detail/size_holder.hpp>
29
46
  #include <boost/intrusive/detail/iterator.hpp>
47
+ #include <boost/intrusive/detail/get_value_traits.hpp>
48
+ #include <boost/intrusive/detail/algorithm.hpp>
49
+ #include <boost/intrusive/detail/value_functors.hpp>
30
50
 
31
51
  //Implementation utilities
32
52
  #include <boost/intrusive/unordered_set_hook.hpp>
33
- #include <boost/intrusive/slist.hpp>
53
+ #include <boost/intrusive/detail/slist_iterator.hpp>
34
54
  #include <boost/intrusive/pointer_traits.hpp>
35
55
  #include <boost/intrusive/detail/mpl.hpp>
56
+ #include <boost/intrusive/circular_slist_algorithms.hpp>
57
+ #include <boost/intrusive/linear_slist_algorithms.hpp>
36
58
 
37
59
  //boost
38
- #include <boost/functional/hash.hpp>
60
+ #include <boost/container_hash/hash.hpp>
39
61
  #include <boost/intrusive/detail/assert.hpp>
40
62
  #include <boost/static_assert.hpp>
41
63
  #include <boost/move/utility_core.hpp>
42
64
  #include <boost/move/adl_move_swap.hpp>
65
+ #include <boost/move/algo/detail/search.hpp>
43
66
 
44
67
  //std C++
45
- #include <boost/intrusive/detail/minimal_less_equal_header.hpp> //std::equal_to
46
68
  #include <boost/intrusive/detail/minimal_pair_header.hpp> //std::pair
47
- #include <algorithm> //std::lower_bound, std::upper_bound
48
69
  #include <cstddef> //std::size_t
70
+ #include <boost/cstdint.hpp> //std::uint64_t
49
71
 
50
72
  #if defined(BOOST_HAS_PRAGMA_ONCE)
51
73
  # pragma once
52
74
  #endif
53
75
 
76
+ #ifdef _MSC_VER
77
+ #include <intrin.h>
78
+ #endif
79
+
80
+
54
81
  namespace boost {
55
82
  namespace intrusive {
56
83
 
84
+ #if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
85
+
57
86
  /// @cond
58
87
 
88
+ //We only support LLP64(Win64) or LP64(most Unix) data models
89
+ #ifdef _WIN64 //In 64 bit windows sizeof(size_t) == sizeof(unsigned long long)
90
+ # define BOOST_INTRUSIVE_SIZE_C(NUMBER) NUMBER##ULL
91
+ # define BOOST_INTRUSIVE_64_BIT_SIZE_T 1
92
+ #else //In 32 bit windows and 32/64 bit unixes sizeof(size_t) == sizeof(unsigned long)
93
+ # define BOOST_INTRUSIVE_SIZE_C(NUMBER) NUMBER##UL
94
+ # define BOOST_INTRUSIVE_64_BIT_SIZE_T (((((ULONG_MAX>>16)>>16)>>16)>>15) != 0)
95
+ #endif
96
+
97
+ template<int Dummy = 0>
98
+ struct prime_list_holder
99
+ {
100
+ private:
101
+
102
+ template <class SizeType> // sizeof(SizeType) < sizeof(std::size_t)
103
+ static BOOST_INTRUSIVE_FORCEINLINE SizeType truncate_size_type(std::size_t n, detail::true_)
104
+ { return n < std::size_t(SizeType(-1)) ? static_cast<SizeType>(n) : SizeType(-1); }
105
+
106
+ template <class SizeType> // sizeof(SizeType) == sizeof(std::size_t)
107
+ static BOOST_INTRUSIVE_FORCEINLINE SizeType truncate_size_type(std::size_t n, detail::false_)
108
+ { return static_cast<SizeType>(n); }
109
+
110
+ static const std::size_t prime_list[];
111
+ static const std::size_t prime_list_size;
112
+
113
+ static const std::size_t *suggested_lower_bucket_count_ptr(std::size_t n)
114
+ {
115
+ const std::size_t *primes = &prime_list[0];
116
+ const std::size_t *primes_end = primes + prime_list_size;
117
+ std::size_t const* bound =
118
+ boost::movelib::lower_bound(primes, primes_end, n, value_less<std::size_t>());
119
+ bound -= std::size_t(bound == primes_end);
120
+ return bound;
121
+ }
122
+
123
+ static const std::size_t *suggested_upper_bucket_count_ptr(std::size_t n)
124
+ {
125
+ const std::size_t *primes = &prime_list[0];
126
+ const std::size_t *primes_end = primes + prime_list_size;
127
+ std::size_t const* bound =
128
+ boost::movelib::upper_bound(primes, primes_end, n, value_less<std::size_t>());
129
+ bound -= std::size_t(bound == primes_end);
130
+ return bound;
131
+ }
132
+
133
+ static std::size_t suggested_lower_bucket_count_impl(std::size_t n)
134
+ { return *suggested_lower_bucket_count_ptr(n); }
135
+
136
+ static std::size_t suggested_upper_bucket_count_impl(std::size_t n)
137
+ { return *suggested_upper_bucket_count_ptr(n); }
138
+
139
+ public:
140
+
141
+ template <class SizeType>
142
+ static BOOST_INTRUSIVE_FORCEINLINE SizeType suggested_upper_bucket_count(SizeType n)
143
+ {
144
+ std::size_t const c = suggested_upper_bucket_count_impl(static_cast<std::size_t>(n));
145
+ return truncate_size_type<SizeType>(c, detail::bool_<(sizeof(SizeType) < sizeof(std::size_t))>());
146
+ }
147
+
148
+ template <class SizeType>
149
+ static BOOST_INTRUSIVE_FORCEINLINE SizeType suggested_lower_bucket_count(SizeType n)
150
+ {
151
+ std::size_t const c = suggested_lower_bucket_count_impl(static_cast<std::size_t>(n));
152
+ return truncate_size_type<SizeType>(c, detail::bool_<(sizeof(SizeType) < sizeof(std::size_t))>());
153
+ }
154
+
155
+ static BOOST_INTRUSIVE_FORCEINLINE std::size_t suggested_lower_bucket_count_idx(std::size_t n)
156
+ { return static_cast<std::size_t>(suggested_lower_bucket_count_ptr(n) - &prime_list[0]); }
157
+
158
+ static BOOST_INTRUSIVE_FORCEINLINE std::size_t suggested_upper_bucket_count_idx(std::size_t n)
159
+ { return static_cast<std::size_t>(suggested_upper_bucket_count_ptr(n) - &prime_list[0]); }
160
+
161
+ static BOOST_INTRUSIVE_FORCEINLINE std::size_t size_from_index(std::size_t n)
162
+ { return prime_list[std::ptrdiff_t(n)]; }
163
+
164
+ template<std::size_t SizeIndex>
165
+ BOOST_INTRUSIVE_FORCEINLINE static std::size_t modfunc(std::size_t hash) { return hash % SizeIndex; }
166
+
167
+ static std::size_t(*const positions[])(std::size_t);
168
+
169
+ #if BOOST_INTRUSIVE_64_BIT_SIZE_T
170
+ static const uint64_t inv_sizes32[];
171
+ static const std::size_t inv_sizes32_size;
172
+ #endif
173
+
174
+ BOOST_INTRUSIVE_FORCEINLINE static std::size_t lower_size_index(std::size_t n)
175
+ { return prime_list_holder<>::suggested_lower_bucket_count_idx(n); }
176
+
177
+ BOOST_INTRUSIVE_FORCEINLINE static std::size_t upper_size_index(std::size_t n)
178
+ { return prime_list_holder<>::suggested_upper_bucket_count_idx(n); }
179
+
180
+ BOOST_INTRUSIVE_FORCEINLINE static std::size_t size(std::size_t size_index)
181
+ { return prime_list_holder<>::size_from_index(size_index); }
182
+
183
+ #if BOOST_INTRUSIVE_64_BIT_SIZE_T
184
+ // https://github.com/lemire/fastmod
185
+
186
+ BOOST_INTRUSIVE_FORCEINLINE static uint64_t mul128_u32(uint64_t lowbits, uint32_t d)
187
+ {
188
+ #if defined(_MSC_VER)
189
+ return __umulh(lowbits, d);
190
+ #elif defined(BOOST_HAS_INT128)
191
+ return static_cast<uint64_t>((uint128_type(lowbits) * d) >> 64);
192
+ #else
193
+ uint64_t r1 = (lowbits & UINT32_MAX) * d;
194
+ uint64_t r2 = (lowbits >> 32) * d;
195
+ r2 += r1 >> 32;
196
+ return r2 >> 32;
197
+ #endif
198
+ }
199
+
200
+ BOOST_INTRUSIVE_FORCEINLINE static uint32_t fastmod_u32(uint32_t a, uint64_t M, uint32_t d)
201
+ {
202
+ uint64_t lowbits = M * a;
203
+ return (uint32_t)(mul128_u32(lowbits, d));
204
+ }
205
+ #endif // BOOST_INTRUSIVE_64_BIT_SIZE_T
206
+
207
+ BOOST_INTRUSIVE_FORCEINLINE static std::size_t position(std::size_t hash,std::size_t size_index)
208
+ {
209
+ #if BOOST_INTRUSIVE_64_BIT_SIZE_T
210
+ BOOST_CONSTEXPR_OR_CONST std::size_t sizes_under_32bit = sizeof(inv_sizes32)/sizeof(inv_sizes32[0]);
211
+ if(BOOST_LIKELY(size_index < sizes_under_32bit)){
212
+ return fastmod_u32( uint32_t(hash)+uint32_t(hash>>32)
213
+ , inv_sizes32[size_index]
214
+ , uint32_t(prime_list[size_index]) );
215
+ }
216
+ else{
217
+ return positions[size_index](hash);
218
+ }
219
+ #else
220
+ return positions[size_index](hash);
221
+ #endif // BOOST_INTRUSIVE_64_BIT_SIZE_T
222
+ }
223
+ };
224
+
225
+ template<int Dummy>
226
+ std::size_t(* const prime_list_holder<Dummy>::positions[])(std::size_t) =
227
+ {
228
+ modfunc<BOOST_INTRUSIVE_SIZE_C(3)>, modfunc<BOOST_INTRUSIVE_SIZE_C(7)>,
229
+ modfunc<BOOST_INTRUSIVE_SIZE_C(11)>, modfunc<BOOST_INTRUSIVE_SIZE_C(17)>,
230
+ modfunc<BOOST_INTRUSIVE_SIZE_C(29)>, modfunc<BOOST_INTRUSIVE_SIZE_C(53)>,
231
+ modfunc<BOOST_INTRUSIVE_SIZE_C(97)>, modfunc<BOOST_INTRUSIVE_SIZE_C(193)>,
232
+ modfunc<BOOST_INTRUSIVE_SIZE_C(389)>, modfunc<BOOST_INTRUSIVE_SIZE_C(769)>,
233
+ modfunc<BOOST_INTRUSIVE_SIZE_C(1543)>, modfunc<BOOST_INTRUSIVE_SIZE_C(3079)>,
234
+ modfunc<BOOST_INTRUSIVE_SIZE_C(6151)>, modfunc<BOOST_INTRUSIVE_SIZE_C(12289)>,
235
+ modfunc<BOOST_INTRUSIVE_SIZE_C(24593)>, modfunc<BOOST_INTRUSIVE_SIZE_C(49157)>,
236
+ modfunc<BOOST_INTRUSIVE_SIZE_C(98317)>, modfunc<BOOST_INTRUSIVE_SIZE_C(196613)>,
237
+ modfunc<BOOST_INTRUSIVE_SIZE_C(393241)>, modfunc<BOOST_INTRUSIVE_SIZE_C(786433)>,
238
+ modfunc<BOOST_INTRUSIVE_SIZE_C(1572869)>, modfunc<BOOST_INTRUSIVE_SIZE_C(3145739)>,
239
+ modfunc<BOOST_INTRUSIVE_SIZE_C(6291469)>, modfunc<BOOST_INTRUSIVE_SIZE_C(12582917)>,
240
+ modfunc<BOOST_INTRUSIVE_SIZE_C(25165843)>, modfunc<BOOST_INTRUSIVE_SIZE_C(50331653)>,
241
+ modfunc<BOOST_INTRUSIVE_SIZE_C(100663319)>, modfunc<BOOST_INTRUSIVE_SIZE_C(201326611)>,
242
+ modfunc<BOOST_INTRUSIVE_SIZE_C(402653189)>, modfunc<BOOST_INTRUSIVE_SIZE_C(805306457)>,
243
+ modfunc<BOOST_INTRUSIVE_SIZE_C(1610612741)>, //0-30 indexes
244
+ #if BOOST_INTRUSIVE_64_BIT_SIZE_T
245
+ //Taken from Boost.MultiIndex code, thanks to Joaquin M. Lopez Munoz.
246
+ modfunc<BOOST_INTRUSIVE_SIZE_C(3221225473)>, //<- 32 bit values stop here (index 31)
247
+ modfunc<BOOST_INTRUSIVE_SIZE_C(6442450939)>, modfunc<BOOST_INTRUSIVE_SIZE_C(12884901893)>,
248
+ modfunc<BOOST_INTRUSIVE_SIZE_C(25769803751)>, modfunc<BOOST_INTRUSIVE_SIZE_C(51539607551)>,
249
+ modfunc<BOOST_INTRUSIVE_SIZE_C(103079215111)>, modfunc<BOOST_INTRUSIVE_SIZE_C(206158430209)>,
250
+ modfunc<BOOST_INTRUSIVE_SIZE_C(412316860441)>, modfunc<BOOST_INTRUSIVE_SIZE_C(824633720831)>,
251
+ modfunc<BOOST_INTRUSIVE_SIZE_C(1649267441651)>, modfunc<BOOST_INTRUSIVE_SIZE_C(3298534883309)>,
252
+ modfunc<BOOST_INTRUSIVE_SIZE_C(6597069766657)>, modfunc<BOOST_INTRUSIVE_SIZE_C(13194139533299)>,
253
+ modfunc<BOOST_INTRUSIVE_SIZE_C(26388279066623)>, modfunc<BOOST_INTRUSIVE_SIZE_C(52776558133303)>,
254
+ modfunc<BOOST_INTRUSIVE_SIZE_C(105553116266489)>, modfunc<BOOST_INTRUSIVE_SIZE_C(211106232532969)>,
255
+ modfunc<BOOST_INTRUSIVE_SIZE_C(422212465066001)>, modfunc<BOOST_INTRUSIVE_SIZE_C(844424930131963)>,
256
+ modfunc<BOOST_INTRUSIVE_SIZE_C(1688849860263953)>, modfunc<BOOST_INTRUSIVE_SIZE_C(3377699720527861)>,
257
+ modfunc<BOOST_INTRUSIVE_SIZE_C(6755399441055731)>, modfunc<BOOST_INTRUSIVE_SIZE_C(13510798882111483)>,
258
+ modfunc<BOOST_INTRUSIVE_SIZE_C(27021597764222939)>, modfunc<BOOST_INTRUSIVE_SIZE_C(54043195528445957)>,
259
+ modfunc<BOOST_INTRUSIVE_SIZE_C(108086391056891903)>, modfunc<BOOST_INTRUSIVE_SIZE_C(216172782113783843)>,
260
+ modfunc<BOOST_INTRUSIVE_SIZE_C(432345564227567621)>, modfunc<BOOST_INTRUSIVE_SIZE_C(864691128455135207)>,
261
+ modfunc<BOOST_INTRUSIVE_SIZE_C(1729382256910270481)>, modfunc<BOOST_INTRUSIVE_SIZE_C(3458764513820540933)>,
262
+ modfunc<BOOST_INTRUSIVE_SIZE_C(6917529027641081903)>, modfunc<BOOST_INTRUSIVE_SIZE_C(9223372036854775783)> //(index 63)
263
+ #else
264
+ modfunc<BOOST_INTRUSIVE_SIZE_C(2147483647)> //<- 32 bit stops here (index 31) as ptrdiff_t is signed
265
+ #endif
266
+ };
267
+
268
+ template<int Dummy>
269
+ const std::size_t prime_list_holder<Dummy>::prime_list[] = {
270
+ BOOST_INTRUSIVE_SIZE_C(3), BOOST_INTRUSIVE_SIZE_C(7),
271
+ BOOST_INTRUSIVE_SIZE_C(11), BOOST_INTRUSIVE_SIZE_C(17),
272
+ BOOST_INTRUSIVE_SIZE_C(29), BOOST_INTRUSIVE_SIZE_C(53),
273
+ BOOST_INTRUSIVE_SIZE_C(97), BOOST_INTRUSIVE_SIZE_C(193),
274
+ BOOST_INTRUSIVE_SIZE_C(389), BOOST_INTRUSIVE_SIZE_C(769),
275
+ BOOST_INTRUSIVE_SIZE_C(1543), BOOST_INTRUSIVE_SIZE_C(3079),
276
+ BOOST_INTRUSIVE_SIZE_C(6151), BOOST_INTRUSIVE_SIZE_C(12289),
277
+ BOOST_INTRUSIVE_SIZE_C(24593), BOOST_INTRUSIVE_SIZE_C(49157),
278
+ BOOST_INTRUSIVE_SIZE_C(98317), BOOST_INTRUSIVE_SIZE_C(196613),
279
+ BOOST_INTRUSIVE_SIZE_C(393241), BOOST_INTRUSIVE_SIZE_C(786433),
280
+ BOOST_INTRUSIVE_SIZE_C(1572869), BOOST_INTRUSIVE_SIZE_C(3145739),
281
+ BOOST_INTRUSIVE_SIZE_C(6291469), BOOST_INTRUSIVE_SIZE_C(12582917),
282
+ BOOST_INTRUSIVE_SIZE_C(25165843), BOOST_INTRUSIVE_SIZE_C(50331653),
283
+ BOOST_INTRUSIVE_SIZE_C(100663319), BOOST_INTRUSIVE_SIZE_C(201326611),
284
+ BOOST_INTRUSIVE_SIZE_C(402653189), BOOST_INTRUSIVE_SIZE_C(805306457),
285
+ BOOST_INTRUSIVE_SIZE_C(1610612741), //0-30 indexes
286
+ #if BOOST_INTRUSIVE_64_BIT_SIZE_T
287
+ //Taken from Boost.MultiIndex code, thanks to Joaquin M. Lopez Munoz.
288
+ BOOST_INTRUSIVE_SIZE_C(3221225473), //<- 32 bit values stop here (index 31)
289
+ BOOST_INTRUSIVE_SIZE_C(6442450939), BOOST_INTRUSIVE_SIZE_C(12884901893),
290
+ BOOST_INTRUSIVE_SIZE_C(25769803751), BOOST_INTRUSIVE_SIZE_C(51539607551),
291
+ BOOST_INTRUSIVE_SIZE_C(103079215111), BOOST_INTRUSIVE_SIZE_C(206158430209),
292
+ BOOST_INTRUSIVE_SIZE_C(412316860441), BOOST_INTRUSIVE_SIZE_C(824633720831),
293
+ BOOST_INTRUSIVE_SIZE_C(1649267441651), BOOST_INTRUSIVE_SIZE_C(3298534883309),
294
+ BOOST_INTRUSIVE_SIZE_C(6597069766657), BOOST_INTRUSIVE_SIZE_C(13194139533299),
295
+ BOOST_INTRUSIVE_SIZE_C(26388279066623), BOOST_INTRUSIVE_SIZE_C(52776558133303),
296
+ BOOST_INTRUSIVE_SIZE_C(105553116266489), BOOST_INTRUSIVE_SIZE_C(211106232532969),
297
+ BOOST_INTRUSIVE_SIZE_C(422212465066001), BOOST_INTRUSIVE_SIZE_C(844424930131963),
298
+ BOOST_INTRUSIVE_SIZE_C(1688849860263953), BOOST_INTRUSIVE_SIZE_C(3377699720527861),
299
+ BOOST_INTRUSIVE_SIZE_C(6755399441055731), BOOST_INTRUSIVE_SIZE_C(13510798882111483),
300
+ BOOST_INTRUSIVE_SIZE_C(27021597764222939), BOOST_INTRUSIVE_SIZE_C(54043195528445957),
301
+ BOOST_INTRUSIVE_SIZE_C(108086391056891903), BOOST_INTRUSIVE_SIZE_C(216172782113783843),
302
+ BOOST_INTRUSIVE_SIZE_C(432345564227567621), BOOST_INTRUSIVE_SIZE_C(864691128455135207),
303
+ BOOST_INTRUSIVE_SIZE_C(1729382256910270481), BOOST_INTRUSIVE_SIZE_C(3458764513820540933),
304
+ BOOST_INTRUSIVE_SIZE_C(6917529027641081903), BOOST_INTRUSIVE_SIZE_C(9223372036854775783) //(index 63)
305
+ #else
306
+ BOOST_INTRUSIVE_SIZE_C(2147483647) //<- 32 bit stops here (index 31) as ptrdiff_t is signed
307
+ #endif
308
+ };
309
+
310
+ template<int Dummy>
311
+ const std::size_t prime_list_holder<Dummy>::prime_list_size
312
+ = sizeof(prime_list) / sizeof(std::size_t);
313
+
314
+
315
+ #if BOOST_INTRUSIVE_64_BIT_SIZE_T
316
+
317
+ template<int Dummy>
318
+ const uint64_t prime_list_holder<Dummy>::inv_sizes32[] = {
319
+ BOOST_INTRUSIVE_SIZE_C(6148914691236517206), //3
320
+ BOOST_INTRUSIVE_SIZE_C(2635249153387078803), //7
321
+ BOOST_INTRUSIVE_SIZE_C(1676976733973595602), //11
322
+ BOOST_INTRUSIVE_SIZE_C(1085102592571150096), //17
323
+ BOOST_INTRUSIVE_SIZE_C(636094623231363849), //29
324
+ BOOST_INTRUSIVE_SIZE_C(348051774975651918), //53
325
+ BOOST_INTRUSIVE_SIZE_C(190172619316593316), //97
326
+ BOOST_INTRUSIVE_SIZE_C(95578984837873325), //193
327
+ BOOST_INTRUSIVE_SIZE_C(47420935922132524), //389
328
+ BOOST_INTRUSIVE_SIZE_C(23987963684927896), //769
329
+ BOOST_INTRUSIVE_SIZE_C(11955116055547344), //1543
330
+ BOOST_INTRUSIVE_SIZE_C(5991147799191151), //3079
331
+ BOOST_INTRUSIVE_SIZE_C(2998982941588287), //6151
332
+ BOOST_INTRUSIVE_SIZE_C(1501077717772769), //12289
333
+ BOOST_INTRUSIVE_SIZE_C(750081082979285), //24593
334
+ BOOST_INTRUSIVE_SIZE_C(375261795343686), //49157
335
+ BOOST_INTRUSIVE_SIZE_C(187625172388393), //98317
336
+ BOOST_INTRUSIVE_SIZE_C(93822606204624), //196613
337
+ BOOST_INTRUSIVE_SIZE_C(46909513691883), //393241
338
+ BOOST_INTRUSIVE_SIZE_C(23456218233098), //786433
339
+ BOOST_INTRUSIVE_SIZE_C(11728086747027), //1572869
340
+ BOOST_INTRUSIVE_SIZE_C(5864041509391), //3145739
341
+ BOOST_INTRUSIVE_SIZE_C(2932024948977), //6291469
342
+ BOOST_INTRUSIVE_SIZE_C(1466014921160), //12582917
343
+ BOOST_INTRUSIVE_SIZE_C(733007198436), //25165843
344
+ BOOST_INTRUSIVE_SIZE_C(366503839517), //50331653
345
+ BOOST_INTRUSIVE_SIZE_C(183251896093), //100663319
346
+ BOOST_INTRUSIVE_SIZE_C(91625960335), //201326611
347
+ BOOST_INTRUSIVE_SIZE_C(45812983922), //402653189
348
+ BOOST_INTRUSIVE_SIZE_C(22906489714), //805306457
349
+ BOOST_INTRUSIVE_SIZE_C(11453246088), //1610612741
350
+ BOOST_INTRUSIVE_SIZE_C(5726623060) //3221225473
351
+ };
352
+
353
+ template<int Dummy>
354
+ const std::size_t prime_list_holder<Dummy>::inv_sizes32_size
355
+ = sizeof(inv_sizes32) / sizeof(uint64_t);
356
+
357
+ #endif // BOOST_INTRUSIVE_64_BIT_SIZE_T
358
+
359
+ struct prime_fmod_size : prime_list_holder<>
360
+ {
361
+ };
362
+
363
+
364
+ #undef BOOST_INTRUSIVE_SIZE_C
365
+ #undef BOOST_INTRUSIVE_64_BIT_SIZE_T
366
+
367
+ #endif //#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
368
+
369
+
370
+
59
371
  template<class InputIt, class T>
60
372
  InputIt priv_algo_find(InputIt first, InputIt last, const T& value)
61
373
  {
62
374
  for (; first != last; ++first) {
63
375
  if (*first == value) {
64
- return first;
376
+ return first;
65
377
  }
66
378
  }
67
379
  return last;
@@ -105,234 +417,173 @@ bool priv_algo_is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, F
105
417
  continue; //We've seen this one before.
106
418
  }
107
419
  distance_type matches = (priv_algo_count)(first2, last2, *scan);
108
- if (0 == matches || (priv_algo_count)(scan, last1, *scan != matches)){
420
+ if (0 == matches || (priv_algo_count)(scan, last1, *scan) != matches){
109
421
  return false;
110
422
  }
111
423
  }
112
424
  return true;
113
425
  }
114
426
 
115
- template<int Dummy = 0>
116
- struct prime_list_holder
427
+ struct hash_bool_flags
117
428
  {
118
- private:
119
-
120
- template <class SizeType> // sizeof(SizeType) < sizeof(std::size_t)
121
- static BOOST_INTRUSIVE_FORCEINLINE SizeType truncate_size_type(std::size_t n, detail::true_)
122
- {
123
- return n < std::size_t(SizeType(-1)) ? static_cast<SizeType>(n) : SizeType(-1);
124
- }
429
+ static const std::size_t unique_keys_pos = 1u;
430
+ static const std::size_t constant_time_size_pos = 2u;
431
+ static const std::size_t power_2_buckets_pos = 4u;
432
+ static const std::size_t cache_begin_pos = 8u;
433
+ static const std::size_t compare_hash_pos = 16u;
434
+ static const std::size_t incremental_pos = 32u;
435
+ static const std::size_t linear_buckets_pos = 64u;
436
+ static const std::size_t fastmod_buckets_pos = 128u;
437
+ };
125
438
 
126
- template <class SizeType> // sizeof(SizeType) == sizeof(std::size_t)
127
- static BOOST_INTRUSIVE_FORCEINLINE SizeType truncate_size_type(std::size_t n, detail::false_)
128
- {
129
- return static_cast<SizeType>(n);
130
- }
439
+ template<class Bucket, class Algo, class Disposer, class SizeType>
440
+ class exception_bucket_disposer
441
+ {
442
+ Bucket *cont_;
443
+ Disposer &disp_;
444
+ const SizeType &constructed_;
131
445
 
132
- template <class SizeType> //sizeof(SizeType) > sizeof(std::size_t)
133
- static BOOST_INTRUSIVE_FORCEINLINE SizeType suggested_upper_bucket_count_dispatch(SizeType n, detail::true_)
134
- {
135
- std::size_t const c = n > std::size_t(-1)
136
- ? std::size_t(-1)
137
- : suggested_upper_bucket_count_impl(static_cast<std::size_t>(n));
138
- return static_cast<SizeType>(c);
139
- }
446
+ exception_bucket_disposer(const exception_bucket_disposer&);
447
+ exception_bucket_disposer &operator=(const exception_bucket_disposer&);
140
448
 
141
- template <class SizeType> //sizeof(SizeType) > sizeof(std::size_t)
142
- static BOOST_INTRUSIVE_FORCEINLINE SizeType suggested_lower_bucket_count_dispatch(SizeType n, detail::true_)
143
- {
144
- std::size_t const c = n > std::size_t(-1)
145
- ? std::size_t(-1)
146
- : suggested_lower_bucket_count_impl(static_cast<std::size_t>(n));
147
- return static_cast<SizeType>(c);
148
- }
449
+ public:
149
450
 
150
- template <class SizeType>
151
- static BOOST_INTRUSIVE_FORCEINLINE SizeType suggested_upper_bucket_count_dispatch(SizeType n, detail::false_)
152
- {
153
- std::size_t const c = suggested_upper_bucket_count_impl(static_cast<std::size_t>(n));
154
- return truncate_size_type<SizeType>(c, detail::bool_<(sizeof(SizeType) < sizeof(std::size_t))>());
451
+ exception_bucket_disposer
452
+ (Bucket &cont, Disposer &disp, const SizeType &constructed)
453
+ : cont_(&cont), disp_(disp), constructed_(constructed)
454
+ {}
155
455
 
156
- }
456
+ BOOST_INTRUSIVE_FORCEINLINE void release()
457
+ { cont_ = 0; }
157
458
 
158
- template <class SizeType>
159
- static BOOST_INTRUSIVE_FORCEINLINE SizeType suggested_lower_bucket_count_dispatch(SizeType n, detail::false_)
459
+ ~exception_bucket_disposer()
160
460
  {
161
- std::size_t const c = suggested_lower_bucket_count_impl(static_cast<std::size_t>(n));
162
- return truncate_size_type<SizeType>(c, detail::bool_<(sizeof(SizeType) < sizeof(std::size_t))>());
461
+ SizeType n = constructed_;
462
+ if(cont_){
463
+ while(n--){
464
+ Algo::detach_and_dispose(cont_[n].get_node_ptr(), disp_);
465
+ }
466
+ }
163
467
  }
468
+ };
164
469
 
165
- static const std::size_t prime_list[];
166
- static const std::size_t prime_list_size;
470
+ template<class SupposedValueTraits>
471
+ struct unordered_bucket_impl
472
+ {
473
+ typedef typename detail::get_node_traits
474
+ <SupposedValueTraits>::type node_traits;
475
+ typedef typename reduced_slist_node_traits
476
+ <node_traits>::type reduced_node_traits;
477
+ typedef bucket_impl<reduced_node_traits> type;
167
478
 
168
- static std::size_t suggested_lower_bucket_count_impl(std::size_t n)
169
- {
170
- const std::size_t *primes = &prime_list_holder<0>::prime_list[0];
171
- const std::size_t *primes_end = primes + prime_list_holder<0>::prime_list_size;
172
- std::size_t const* bound = std::lower_bound(primes, primes_end, n);
173
- //Tables have upper SIZE_MAX, so we must always found an entry
174
- BOOST_INTRUSIVE_INVARIANT_ASSERT(bound != primes_end);
175
- bound -= std::size_t(bound != primes);
176
- return *bound;
177
- }
479
+ typedef typename pointer_traits
480
+ <typename reduced_node_traits::node_ptr>
481
+ ::template rebind_pointer<type>::type pointer;
482
+ };
178
483
 
179
- static std::size_t suggested_upper_bucket_count_impl(std::size_t n)
180
- {
181
- const std::size_t *primes = &prime_list_holder<0>::prime_list[0];
182
- const std::size_t *primes_end = primes + prime_list_holder<0>::prime_list_size;
183
- std::size_t const* bound = std::upper_bound(primes, primes_end, n);
184
- bound -= std::size_t(bound == primes_end);
185
- return *bound;
186
- }
484
+ template<class SupposedValueTraits>
485
+ struct unordered_bucket_ptr_impl
486
+ {
487
+ typedef typename unordered_bucket_impl<SupposedValueTraits>::pointer type;
488
+ };
187
489
 
188
- public:
189
490
 
190
- template <class SizeType>
191
- static BOOST_INTRUSIVE_FORCEINLINE SizeType suggested_upper_bucket_count(SizeType n)
192
- {
193
- return (suggested_upper_bucket_count_dispatch)(n, detail::bool_<(sizeof(SizeType) > sizeof(std::size_t))>());
194
- }
491
+ template <class BucketPtr, class SizeType>
492
+ struct bucket_traits_impl
493
+ {
494
+ private:
495
+ BOOST_COPYABLE_AND_MOVABLE(bucket_traits_impl)
195
496
 
196
- template <class SizeType>
197
- static BOOST_INTRUSIVE_FORCEINLINE SizeType suggested_lower_bucket_count(SizeType n)
198
- {
199
- return (suggested_lower_bucket_count_dispatch)(n, detail::bool_<(sizeof(SizeType) > sizeof(std::size_t))>());
200
- }
201
- };
497
+ public:
498
+ /// @cond
202
499
 
203
- #if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
500
+ typedef BucketPtr bucket_ptr;
501
+ typedef SizeType size_type;
204
502
 
205
- //We only support LLP64(Win64) or LP64(most Unix) data models
206
- #ifdef _WIN64 //In 64 bit windows sizeof(size_t) == sizeof(unsigned long long)
207
- #define BOOST_INTRUSIVE_PRIME_C(NUMBER) NUMBER##ULL
208
- #define BOOST_INTRUSIVE_64_BIT_SIZE_T 1
209
- #else //In 32 bit windows and 32/64 bit unixes sizeof(size_t) == sizeof(unsigned long)
210
- #define BOOST_INTRUSIVE_PRIME_C(NUMBER) NUMBER##UL
211
- #define BOOST_INTRUSIVE_64_BIT_SIZE_T (((((ULONG_MAX>>16)>>16)>>16)>>15) != 0)
212
- #endif
503
+ /// @endcond
213
504
 
214
- template<int Dummy>
215
- const std::size_t prime_list_holder<Dummy>::prime_list[] = {
216
- BOOST_INTRUSIVE_PRIME_C(3), BOOST_INTRUSIVE_PRIME_C(7),
217
- BOOST_INTRUSIVE_PRIME_C(11), BOOST_INTRUSIVE_PRIME_C(17),
218
- BOOST_INTRUSIVE_PRIME_C(29), BOOST_INTRUSIVE_PRIME_C(53),
219
- BOOST_INTRUSIVE_PRIME_C(97), BOOST_INTRUSIVE_PRIME_C(193),
220
- BOOST_INTRUSIVE_PRIME_C(389), BOOST_INTRUSIVE_PRIME_C(769),
221
- BOOST_INTRUSIVE_PRIME_C(1543), BOOST_INTRUSIVE_PRIME_C(3079),
222
- BOOST_INTRUSIVE_PRIME_C(6151), BOOST_INTRUSIVE_PRIME_C(12289),
223
- BOOST_INTRUSIVE_PRIME_C(24593), BOOST_INTRUSIVE_PRIME_C(49157),
224
- BOOST_INTRUSIVE_PRIME_C(98317), BOOST_INTRUSIVE_PRIME_C(196613),
225
- BOOST_INTRUSIVE_PRIME_C(393241), BOOST_INTRUSIVE_PRIME_C(786433),
226
- BOOST_INTRUSIVE_PRIME_C(1572869), BOOST_INTRUSIVE_PRIME_C(3145739),
227
- BOOST_INTRUSIVE_PRIME_C(6291469), BOOST_INTRUSIVE_PRIME_C(12582917),
228
- BOOST_INTRUSIVE_PRIME_C(25165843), BOOST_INTRUSIVE_PRIME_C(50331653),
229
- BOOST_INTRUSIVE_PRIME_C(100663319), BOOST_INTRUSIVE_PRIME_C(201326611),
230
- BOOST_INTRUSIVE_PRIME_C(402653189), BOOST_INTRUSIVE_PRIME_C(805306457),
231
- BOOST_INTRUSIVE_PRIME_C(1610612741), BOOST_INTRUSIVE_PRIME_C(3221225473),
232
- #if BOOST_INTRUSIVE_64_BIT_SIZE_T
233
- //Taken from Boost.MultiIndex code, thanks to Joaquin M Lopez Munoz.
234
- BOOST_INTRUSIVE_PRIME_C(6442450939), BOOST_INTRUSIVE_PRIME_C(12884901893),
235
- BOOST_INTRUSIVE_PRIME_C(25769803751), BOOST_INTRUSIVE_PRIME_C(51539607551),
236
- BOOST_INTRUSIVE_PRIME_C(103079215111), BOOST_INTRUSIVE_PRIME_C(206158430209),
237
- BOOST_INTRUSIVE_PRIME_C(412316860441), BOOST_INTRUSIVE_PRIME_C(824633720831),
238
- BOOST_INTRUSIVE_PRIME_C(1649267441651), BOOST_INTRUSIVE_PRIME_C(3298534883309),
239
- BOOST_INTRUSIVE_PRIME_C(6597069766657), BOOST_INTRUSIVE_PRIME_C(13194139533299),
240
- BOOST_INTRUSIVE_PRIME_C(26388279066623), BOOST_INTRUSIVE_PRIME_C(52776558133303),
241
- BOOST_INTRUSIVE_PRIME_C(105553116266489), BOOST_INTRUSIVE_PRIME_C(211106232532969),
242
- BOOST_INTRUSIVE_PRIME_C(422212465066001), BOOST_INTRUSIVE_PRIME_C(844424930131963),
243
- BOOST_INTRUSIVE_PRIME_C(1688849860263953), BOOST_INTRUSIVE_PRIME_C(3377699720527861),
244
- BOOST_INTRUSIVE_PRIME_C(6755399441055731), BOOST_INTRUSIVE_PRIME_C(13510798882111483),
245
- BOOST_INTRUSIVE_PRIME_C(27021597764222939), BOOST_INTRUSIVE_PRIME_C(54043195528445957),
246
- BOOST_INTRUSIVE_PRIME_C(108086391056891903), BOOST_INTRUSIVE_PRIME_C(216172782113783843),
247
- BOOST_INTRUSIVE_PRIME_C(432345564227567621), BOOST_INTRUSIVE_PRIME_C(864691128455135207),
248
- BOOST_INTRUSIVE_PRIME_C(1729382256910270481), BOOST_INTRUSIVE_PRIME_C(3458764513820540933),
249
- BOOST_INTRUSIVE_PRIME_C(6917529027641081903), BOOST_INTRUSIVE_PRIME_C(13835058055282163729),
250
- BOOST_INTRUSIVE_PRIME_C(18446744073709551557), BOOST_INTRUSIVE_PRIME_C(18446744073709551615) //Upper limit, just in case
251
- #else
252
- BOOST_INTRUSIVE_PRIME_C(4294967291), BOOST_INTRUSIVE_PRIME_C(4294967295) //Upper limit, just in case
253
- #endif
254
- };
505
+ BOOST_INTRUSIVE_FORCEINLINE bucket_traits_impl(bucket_ptr buckets, size_type len)
506
+ : buckets_(buckets), buckets_len_(len)
507
+ {}
255
508
 
256
- #undef BOOST_INTRUSIVE_PRIME_C
257
- #undef BOOST_INTRUSIVE_64_BIT_SIZE_T
509
+ BOOST_INTRUSIVE_FORCEINLINE bucket_traits_impl(const bucket_traits_impl& x)
510
+ : buckets_(x.buckets_), buckets_len_(x.buckets_len_)
511
+ {}
258
512
 
259
- #endif //#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
513
+ BOOST_INTRUSIVE_FORCEINLINE bucket_traits_impl(BOOST_RV_REF(bucket_traits_impl) x)
514
+ : buckets_(x.buckets_), buckets_len_(x.buckets_len_)
515
+ {
516
+ x.buckets_ = bucket_ptr(); x.buckets_len_ = 0u;
517
+ }
260
518
 
261
- template<int Dummy>
262
- const std::size_t prime_list_holder<Dummy>::prime_list_size
263
- = sizeof(prime_list)/sizeof(std::size_t);
519
+ BOOST_INTRUSIVE_FORCEINLINE bucket_traits_impl& operator=(BOOST_RV_REF(bucket_traits_impl) x)
520
+ {
521
+ buckets_ = x.buckets_; buckets_len_ = x.buckets_len_;
522
+ x.buckets_ = bucket_ptr(); x.buckets_len_ = 0u; return *this;
523
+ }
264
524
 
265
- struct hash_bool_flags
266
- {
267
- static const std::size_t unique_keys_pos = 1u;
268
- static const std::size_t constant_time_size_pos = 2u;
269
- static const std::size_t power_2_buckets_pos = 4u;
270
- static const std::size_t cache_begin_pos = 8u;
271
- static const std::size_t compare_hash_pos = 16u;
272
- static const std::size_t incremental_pos = 32u;
273
- };
525
+ BOOST_INTRUSIVE_FORCEINLINE bucket_traits_impl& operator=(BOOST_COPY_ASSIGN_REF(bucket_traits_impl) x)
526
+ {
527
+ buckets_ = x.buckets_; buckets_len_ = x.buckets_len_; return *this;
528
+ }
274
529
 
275
- namespace detail {
530
+ BOOST_INTRUSIVE_FORCEINLINE bucket_ptr bucket_begin() const
531
+ {
532
+ return buckets_;
533
+ }
276
534
 
277
- template<class SupposedValueTraits>
278
- struct get_slist_impl_from_supposed_value_traits
279
- {
280
- typedef SupposedValueTraits value_traits;
281
- typedef typename detail::get_node_traits
282
- <value_traits>::type node_traits;
283
- typedef typename get_slist_impl
284
- <typename reduced_slist_node_traits
285
- <node_traits>::type
286
- >::type type;
287
- };
535
+ BOOST_INTRUSIVE_FORCEINLINE size_type bucket_count() const BOOST_NOEXCEPT
536
+ {
537
+ return buckets_len_;
538
+ }
288
539
 
289
- template<class SupposedValueTraits>
290
- struct unordered_bucket_impl
291
- {
292
- typedef typename
293
- get_slist_impl_from_supposed_value_traits
294
- <SupposedValueTraits>::type slist_impl;
295
- typedef bucket_impl<slist_impl> implementation_defined;
296
- typedef implementation_defined type;
540
+ private:
541
+ bucket_ptr buckets_;
542
+ size_type buckets_len_;
297
543
  };
298
544
 
299
- template<class SupposedValueTraits>
300
- struct unordered_bucket_ptr_impl
301
- {
302
- typedef typename detail::get_node_traits
303
- <SupposedValueTraits>::type::node_ptr node_ptr;
304
- typedef typename unordered_bucket_impl
305
- <SupposedValueTraits>::type bucket_type;
306
-
307
- typedef typename pointer_traits
308
- <node_ptr>::template rebind_pointer
309
- < bucket_type >::type implementation_defined;
310
- typedef implementation_defined type;
311
- };
312
545
 
313
546
  template <class T>
314
547
  struct store_hash_is_true
315
548
  {
316
549
  template<bool Add>
317
- struct two_or_three {yes_type _[2 + Add];};
318
- template <class U> static yes_type test(...);
550
+ struct two_or_three {detail::yes_type _[2u + (unsigned)Add];};
551
+ template <class U> static detail::yes_type test(...);
319
552
  template <class U> static two_or_three<U::store_hash> test (int);
320
- static const bool value = sizeof(test<T>(0)) > sizeof(yes_type)*2;
553
+ static const bool value = sizeof(test<T>(0)) > sizeof(detail::yes_type)*2u;
321
554
  };
322
555
 
323
556
  template <class T>
324
557
  struct optimize_multikey_is_true
325
558
  {
326
559
  template<bool Add>
327
- struct two_or_three {yes_type _[2 + Add];};
328
- template <class U> static yes_type test(...);
560
+ struct two_or_three { detail::yes_type _[2u + (unsigned)Add];};
561
+ template <class U> static detail::yes_type test(...);
329
562
  template <class U> static two_or_three<U::optimize_multikey> test (int);
330
- static const bool value = sizeof(test<T>(0)) > sizeof(yes_type)*2;
563
+ static const bool value = sizeof(test<T>(0)) > sizeof(detail::yes_type)*2u;
331
564
  };
332
565
 
566
+ template<bool StoreHash>
333
567
  struct insert_commit_data_impl
334
568
  {
335
569
  std::size_t hash;
570
+ std::size_t bucket_idx;
571
+ BOOST_INTRUSIVE_FORCEINLINE std::size_t get_hash() const
572
+ { return hash; }
573
+
574
+ BOOST_INTRUSIVE_FORCEINLINE void set_hash(std::size_t h)
575
+ { hash = h; }
576
+ };
577
+
578
+ template<>
579
+ struct insert_commit_data_impl<false>
580
+ {
581
+ std::size_t bucket_idx;
582
+ BOOST_INTRUSIVE_FORCEINLINE std::size_t get_hash() const
583
+ { return 0U; }
584
+
585
+ BOOST_INTRUSIVE_FORCEINLINE void set_hash(std::size_t)
586
+ {}
336
587
  };
337
588
 
338
589
  template<class Node, class SlistNodePtr>
@@ -375,21 +626,22 @@ struct group_functions
375
626
  typedef circular_slist_algorithms<node_traits> node_algorithms;
376
627
 
377
628
  static slist_node_ptr get_bucket_before_begin
378
- (slist_node_ptr bucket_beg, slist_node_ptr bucket_end, node_ptr p)
629
+ (slist_node_ptr bucket_beg, slist_node_ptr bucket_last, slist_node_ptr sp, detail::true_)
379
630
  {
380
631
  //First find the last node of p's group.
381
632
  //This requires checking the first node of the next group or
382
633
  //the bucket node.
634
+ node_ptr p = dcast_bucket_ptr<node>(sp);
383
635
  node_ptr prev_node = p;
384
636
  node_ptr nxt(node_traits::get_next(p));
385
- while(!(bucket_beg <= nxt && nxt <= bucket_end) &&
637
+ while(!(bucket_beg <= nxt && nxt <= bucket_last) &&
386
638
  (group_traits::get_next(nxt) == prev_node)){
387
639
  prev_node = nxt;
388
640
  nxt = node_traits::get_next(nxt);
389
641
  }
390
642
 
391
643
  //If we've reached the bucket node just return it.
392
- if(bucket_beg <= nxt && nxt <= bucket_end){
644
+ if(bucket_beg <= nxt && nxt <= bucket_last){
393
645
  return nxt;
394
646
  }
395
647
 
@@ -398,17 +650,28 @@ struct group_functions
398
650
  node_ptr last_node_group = group_traits::get_next(first_node_of_group);
399
651
  slist_node_ptr possible_end = node_traits::get_next(last_node_group);
400
652
 
401
- while(!(bucket_beg <= possible_end && possible_end <= bucket_end)){
402
- first_node_of_group = detail::dcast_bucket_ptr<node>(possible_end);
653
+ while(!(bucket_beg <= possible_end && possible_end <= bucket_last)){
654
+ first_node_of_group = dcast_bucket_ptr<node>(possible_end);
403
655
  last_node_group = group_traits::get_next(first_node_of_group);
404
656
  possible_end = node_traits::get_next(last_node_group);
405
657
  }
406
658
  return possible_end;
407
659
  }
408
660
 
661
+ static slist_node_ptr get_bucket_before_begin
662
+ (slist_node_ptr bucket_beg, slist_node_ptr bucket_last, slist_node_ptr sp, detail::false_)
663
+ {
664
+ //The end node is embedded in the singly linked list:
665
+ //iterate until we reach it.
666
+ while (!(bucket_beg <= sp && sp <= bucket_last)){
667
+ sp = reduced_node_traits::get_next(sp);
668
+ }
669
+ return sp;
670
+ }
671
+
409
672
  static node_ptr get_prev_to_first_in_group(slist_node_ptr bucket_node, node_ptr first_in_group)
410
673
  {
411
- node_ptr nb = detail::dcast_bucket_ptr<node>(bucket_node);
674
+ node_ptr nb = dcast_bucket_ptr<node>(bucket_node);
412
675
  node_ptr n;
413
676
  while((n = node_traits::get_next(nb)) != first_in_group){
414
677
  nb = group_traits::get_next(n); //go to last in group
@@ -426,7 +689,7 @@ struct group_functions
426
689
  }
427
690
  }
428
691
 
429
- BOOST_INTRUSIVE_FORCEINLINE static void erase_from_group(const slist_node_ptr&, const node_ptr&, detail::false_)
692
+ BOOST_INTRUSIVE_FORCEINLINE static void erase_from_group(slist_node_ptr, node_ptr, detail::false_)
430
693
  {}
431
694
 
432
695
  BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_last_in_group(node_ptr first_in_group, detail::true_)
@@ -444,33 +707,35 @@ struct group_functions
444
707
  return n;
445
708
  }
446
709
 
447
- BOOST_INTRUSIVE_FORCEINLINE static node_ptr next_group_if_first_in_group(node_ptr ptr)
448
- {
449
- return node_traits::get_next(group_traits::get_next(ptr));
450
- }
451
-
452
710
  BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_first_in_group(node_ptr n, detail::false_)
453
711
  { return n; }
454
712
 
455
- BOOST_INTRUSIVE_FORCEINLINE static void insert_in_group(node_ptr first_in_group, node_ptr n, true_)
713
+ BOOST_INTRUSIVE_FORCEINLINE static bool is_first_in_group(node_ptr ptr)
714
+ { return node_traits::get_next(group_traits::get_next(ptr)) != ptr; }
715
+
716
+
717
+ BOOST_INTRUSIVE_FORCEINLINE static void insert_in_group(node_ptr first_in_group, node_ptr n, detail::true_)
456
718
  { group_algorithms::link_after(first_in_group, n); }
457
719
 
458
- static void insert_in_group(const node_ptr&, const node_ptr&, false_)
720
+ BOOST_INTRUSIVE_FORCEINLINE static void insert_in_group(node_ptr, node_ptr, detail::false_)
459
721
  {}
460
722
 
461
- BOOST_INTRUSIVE_FORCEINLINE static node_ptr split_group(node_ptr const new_first_in_group)
723
+ //Splits a group in two groups, and makes "new_first" the first node in the second group.
724
+ //Returns the first element of the first group
725
+ static node_ptr split_group(node_ptr const new_first)
462
726
  {
463
- node_ptr const first((get_first_in_group)(new_first_in_group, detail::true_()));
464
- if(first != new_first_in_group){
465
- node_ptr const last = group_traits::get_next(first);
466
- group_traits::set_next(first, group_traits::get_next(new_first_in_group));
467
- group_traits::set_next(new_first_in_group, last);
727
+ node_ptr const old_first((get_first_in_group)(new_first, detail::true_()));
728
+ //Check new_first was not the first in group
729
+ if(old_first != new_first){
730
+ node_ptr const last = group_traits::get_next(old_first);
731
+ group_traits::set_next(old_first, group_traits::get_next(new_first));
732
+ group_traits::set_next(new_first, last);
468
733
  }
469
- return first;
734
+ return old_first;
470
735
  }
471
736
  };
472
737
 
473
- template<class BucketType, class SplitTraits>
738
+ template<class BucketType, class SplitTraits, class SlistNodeAlgorithms>
474
739
  class incremental_rehash_rollback
475
740
  {
476
741
  private:
@@ -483,9 +748,9 @@ class incremental_rehash_rollback
483
748
 
484
749
  public:
485
750
  incremental_rehash_rollback
486
- (bucket_type &source_bucket, bucket_type &destiny_bucket, split_traits &split_traits)
751
+ (bucket_type &source_bucket, bucket_type &destiny_bucket, split_traits &split_tr)
487
752
  : source_bucket_(source_bucket), destiny_bucket_(destiny_bucket)
488
- , split_traits_(split_traits), released_(false)
753
+ , split_traits_(split_tr), released_(false)
489
754
  {}
490
755
 
491
756
  BOOST_INTRUSIVE_FORCEINLINE void release()
@@ -496,7 +761,7 @@ class incremental_rehash_rollback
496
761
  if(!released_){
497
762
  //If an exception is thrown, just put all moved nodes back in the old bucket
498
763
  //and move back the split mark.
499
- destiny_bucket_.splice_after(destiny_bucket_.before_begin(), source_bucket_);
764
+ SlistNodeAlgorithms::transfer_after(destiny_bucket_.get_node_ptr(), source_bucket_.get_node_ptr());
500
765
  split_traits_.decrement();
501
766
  }
502
767
  }
@@ -511,10 +776,10 @@ class incremental_rehash_rollback
511
776
  template<class NodeTraits>
512
777
  struct node_functions
513
778
  {
514
- BOOST_INTRUSIVE_FORCEINLINE static void store_hash(typename NodeTraits::node_ptr p, std::size_t h, true_)
779
+ BOOST_INTRUSIVE_FORCEINLINE static void store_hash(typename NodeTraits::node_ptr p, std::size_t h, detail::true_)
515
780
  { return NodeTraits::set_hash(p, h); }
516
781
 
517
- BOOST_INTRUSIVE_FORCEINLINE static void store_hash(typename NodeTraits::node_ptr, std::size_t, false_)
782
+ BOOST_INTRUSIVE_FORCEINLINE static void store_hash(typename NodeTraits::node_ptr, std::size_t, detail::false_)
518
783
  {}
519
784
  };
520
785
 
@@ -524,26 +789,29 @@ BOOST_INTRUSIVE_FORCEINLINE std::size_t hash_to_bucket(std::size_t hash_value, s
524
789
  BOOST_INTRUSIVE_FORCEINLINE std::size_t hash_to_bucket(std::size_t hash_value, std::size_t bucket_cnt, detail::true_)
525
790
  { return hash_value & (bucket_cnt - 1); }
526
791
 
527
- template<bool Power2Buckets, bool Incremental>
528
- BOOST_INTRUSIVE_FORCEINLINE std::size_t hash_to_bucket_split(std::size_t hash_value, std::size_t bucket_cnt, std::size_t split)
792
+ template<bool Power2Buckets, bool Incremental> //!fastmod_buckets
793
+ BOOST_INTRUSIVE_FORCEINLINE std::size_t hash_to_bucket_split(std::size_t hash_value, std::size_t bucket_cnt, std::size_t split, detail::false_)
529
794
  {
530
- std::size_t bucket_number = detail::hash_to_bucket(hash_value, bucket_cnt, detail::bool_<Power2Buckets>());
531
- if(Incremental)
795
+ std::size_t bucket_number = hash_to_bucket(hash_value, bucket_cnt, detail::bool_<Power2Buckets>());
796
+ BOOST_IF_CONSTEXPR(Incremental)
532
797
  bucket_number -= static_cast<std::size_t>(bucket_number >= split)*(bucket_cnt/2);
533
798
  return bucket_number;
534
799
  }
535
800
 
536
- } //namespace detail {
801
+ template<bool Power2Buckets, bool Incremental> //fastmod_buckets
802
+ BOOST_INTRUSIVE_FORCEINLINE std::size_t hash_to_bucket_split(std::size_t hash_value, std::size_t , std::size_t split, detail::true_)
803
+ {
804
+ return prime_fmod_size::position(hash_value, split);
805
+ }
537
806
 
538
807
  //!This metafunction will obtain the type of a bucket
539
808
  //!from the value_traits or hook option to be used with
540
809
  //!a hash container.
541
810
  template<class ValueTraitsOrHookOption>
542
811
  struct unordered_bucket
543
- : public detail::unordered_bucket_impl
544
- <typename ValueTraitsOrHookOption::
545
- template pack<empty>::proto_value_traits
546
- >
812
+ : public unordered_bucket_impl
813
+ < typename ValueTraitsOrHookOption::
814
+ template pack<empty>::proto_value_traits>
547
815
  {};
548
816
 
549
817
  //!This metafunction will obtain the type of a bucket pointer
@@ -551,10 +819,9 @@ struct unordered_bucket
551
819
  //!a hash container.
552
820
  template<class ValueTraitsOrHookOption>
553
821
  struct unordered_bucket_ptr
554
- : public detail::unordered_bucket_ptr_impl
555
- <typename ValueTraitsOrHookOption::
556
- template pack<empty>::proto_value_traits
557
- >
822
+ : public unordered_bucket_ptr_impl
823
+ < typename ValueTraitsOrHookOption::
824
+ template pack<empty>::proto_value_traits>
558
825
  {};
559
826
 
560
827
  //!This metafunction will obtain the type of the default bucket traits
@@ -565,13 +832,12 @@ template<class ValueTraitsOrHookOption>
565
832
  struct unordered_default_bucket_traits
566
833
  {
567
834
  typedef typename ValueTraitsOrHookOption::
568
- template pack<empty>::proto_value_traits supposed_value_traits;
569
- typedef typename detail::
570
- get_slist_impl_from_supposed_value_traits
571
- <supposed_value_traits>::type slist_impl;
835
+ template pack<empty>::proto_value_traits supposed_value_traits;
836
+
572
837
  typedef bucket_traits_impl
573
- <slist_impl> implementation_defined;
574
- typedef implementation_defined type;
838
+ < typename unordered_bucket_ptr_impl
839
+ <supposed_value_traits>::type
840
+ , std::size_t> type;
575
841
  };
576
842
 
577
843
  struct default_bucket_traits;
@@ -597,30 +863,30 @@ struct hashtable_defaults
597
863
  static const bool cache_begin = false;
598
864
  static const bool compare_hash = false;
599
865
  static const bool incremental = false;
866
+ static const bool linear_buckets = false;
867
+ static const bool fastmod_buckets = false;
600
868
  };
601
869
 
602
870
  template<class ValueTraits, bool IsConst>
603
871
  struct downcast_node_to_value_t
604
872
  : public detail::node_to_value<ValueTraits, IsConst>
605
873
  {
606
- typedef detail::node_to_value<ValueTraits, IsConst> base_t;
607
- typedef typename base_t::result_type result_type;
608
- typedef ValueTraits value_traits;
609
- typedef typename get_slist_impl
610
- <typename reduced_slist_node_traits
611
- <typename value_traits::node_traits>::type
612
- >::type slist_impl;
874
+ typedef detail::node_to_value<ValueTraits, IsConst> base_t;
875
+ typedef typename base_t::result_type result_type;
876
+ typedef ValueTraits value_traits;
877
+ typedef typename unordered_bucket_impl
878
+ <value_traits>::type::node_traits::node node;
613
879
  typedef typename detail::add_const_if_c
614
- <typename slist_impl::node, IsConst>::type & first_argument_type;
880
+ <node, IsConst>::type &first_argument_type;
615
881
  typedef typename detail::add_const_if_c
616
882
  < typename ValueTraits::node_traits::node
617
- , IsConst>::type & intermediate_argument_type;
883
+ , IsConst>::type &intermediate_argument_type;
618
884
  typedef typename pointer_traits
619
885
  <typename ValueTraits::pointer>::
620
886
  template rebind_pointer
621
887
  <const ValueTraits>::type const_value_traits_ptr;
622
888
 
623
- BOOST_INTRUSIVE_FORCEINLINE downcast_node_to_value_t(const const_value_traits_ptr &ptr)
889
+ BOOST_INTRUSIVE_FORCEINLINE downcast_node_to_value_t(const_value_traits_ptr ptr)
624
890
  : base_t(ptr)
625
891
  {}
626
892
 
@@ -655,25 +921,58 @@ struct node_cast_adaptor
655
921
  //bucket_plus_vtraits stores ValueTraits + BucketTraits
656
922
  //this data is needed by iterators to obtain the
657
923
  //value from the iterator and detect the bucket
658
- template<class ValueTraits, class BucketTraits>
924
+ template<class ValueTraits, class BucketTraits, bool LinearBuckets>
659
925
  struct bucket_plus_vtraits
660
926
  {
927
+ private:
928
+ BOOST_MOVABLE_BUT_NOT_COPYABLE(bucket_plus_vtraits)
929
+
930
+
931
+ struct data_type
932
+ : public ValueTraits, BucketTraits
933
+ {
934
+ private:
935
+ BOOST_MOVABLE_BUT_NOT_COPYABLE(data_type)
936
+
937
+ public:
938
+ BOOST_INTRUSIVE_FORCEINLINE data_type(const ValueTraits& val_traits, const BucketTraits& b_traits)
939
+ : ValueTraits(val_traits), BucketTraits(b_traits)
940
+ {}
941
+
942
+ BOOST_INTRUSIVE_FORCEINLINE data_type(BOOST_RV_REF(data_type) other)
943
+ : ValueTraits (BOOST_MOVE_BASE(ValueTraits, other))
944
+ , BucketTraits(BOOST_MOVE_BASE(BucketTraits, other))
945
+ {}
946
+ } m_data;
947
+
948
+ public:
661
949
  typedef BucketTraits bucket_traits;
662
950
  typedef ValueTraits value_traits;
663
951
 
664
952
  static const bool safemode_or_autounlink = is_safe_autounlink<value_traits::link_mode>::value;
665
953
 
666
- typedef typename
667
- detail::get_slist_impl_from_supposed_value_traits
668
- <value_traits>::type slist_impl;
954
+ typedef typename unordered_bucket_impl
955
+ <value_traits>::type bucket_type;
956
+ typedef typename unordered_bucket_ptr_impl
957
+ <value_traits>::type bucket_ptr;
669
958
  typedef typename value_traits::node_traits node_traits;
959
+ typedef typename bucket_type::node_traits slist_node_traits;
670
960
  typedef unordered_group_adapter<node_traits> group_traits;
671
- typedef typename slist_impl::iterator siterator;
672
- typedef bucket_impl<slist_impl> bucket_type;
673
- typedef detail::group_functions<node_traits> group_functions_t;
674
- typedef typename slist_impl::node_algorithms node_algorithms;
675
- typedef typename slist_impl::node_ptr slist_node_ptr;
676
- typedef typename node_traits::node_ptr node_ptr;
961
+ typedef group_functions<node_traits> group_functions_t;
962
+ typedef typename detail::if_c
963
+ < LinearBuckets
964
+ , linear_slist_algorithms<slist_node_traits>
965
+ , circular_slist_algorithms<slist_node_traits>
966
+ >::type slist_node_algorithms;
967
+
968
+ typedef typename slist_node_traits::node_ptr slist_node_ptr;
969
+ typedef trivial_value_traits
970
+ <slist_node_traits, normal_link> slist_value_traits;
971
+ typedef slist_iterator<slist_value_traits, false> siterator;
972
+ typedef slist_iterator<slist_value_traits, true> const_siterator;
973
+
974
+ typedef typename node_traits::node_ptr node_ptr;
975
+ typedef typename node_traits::const_node_ptr const_node_ptr;
677
976
  typedef typename node_traits::node node;
678
977
  typedef typename value_traits::value_type value_type;
679
978
  typedef typename value_traits::pointer pointer;
@@ -690,16 +989,18 @@ struct bucket_plus_vtraits
690
989
  <typename value_traits::pointer>::
691
990
  template rebind_pointer
692
991
  <const bucket_plus_vtraits>::type const_bucket_value_traits_ptr;
693
- typedef typename detail::unordered_bucket_ptr_impl
694
- <value_traits>::type bucket_ptr;
992
+ typedef detail::bool_<LinearBuckets> linear_buckets_t;
993
+ typedef bucket_plus_vtraits& this_ref;
994
+
995
+ static const std::size_t bucket_overhead = LinearBuckets ? 1u : 0u;
695
996
 
696
- template<class BucketTraitsType>
697
- BOOST_INTRUSIVE_FORCEINLINE bucket_plus_vtraits(const ValueTraits &val_traits, BOOST_FWD_REF(BucketTraitsType) b_traits)
698
- : data(val_traits, ::boost::forward<BucketTraitsType>(b_traits))
997
+ BOOST_INTRUSIVE_FORCEINLINE bucket_plus_vtraits(const ValueTraits &val_traits, const bucket_traits &b_traits)
998
+ : m_data(val_traits, b_traits)
699
999
  {}
700
1000
 
701
- BOOST_INTRUSIVE_FORCEINLINE bucket_plus_vtraits & operator =(const bucket_plus_vtraits &x)
702
- { data.bucket_traits_ = x.data.bucket_traits_; return *this; }
1001
+ BOOST_INTRUSIVE_FORCEINLINE bucket_plus_vtraits(BOOST_RV_REF(bucket_plus_vtraits) other)
1002
+ : m_data(boost::move(((bucket_plus_vtraits&)other).m_data))
1003
+ {}
703
1004
 
704
1005
  BOOST_INTRUSIVE_FORCEINLINE const_value_traits_ptr priv_value_traits_ptr() const
705
1006
  { return pointer_traits<const_value_traits_ptr>::pointer_to(this->priv_value_traits()); }
@@ -718,47 +1019,129 @@ struct bucket_plus_vtraits
718
1019
  //value traits
719
1020
  //
720
1021
  BOOST_INTRUSIVE_FORCEINLINE const value_traits &priv_value_traits() const
721
- { return this->data; }
1022
+ { return static_cast<const value_traits &>(this->m_data); }
722
1023
 
723
1024
  BOOST_INTRUSIVE_FORCEINLINE value_traits &priv_value_traits()
724
- { return this->data; }
1025
+ { return static_cast<value_traits &>(this->m_data); }
725
1026
 
726
- //bucket_traits
1027
+ //value traits
727
1028
  //
728
1029
  BOOST_INTRUSIVE_FORCEINLINE const bucket_traits &priv_bucket_traits() const
729
- { return this->data.bucket_traits_; }
1030
+ { return static_cast<const bucket_traits &>(this->m_data); }
730
1031
 
731
- BOOST_INTRUSIVE_FORCEINLINE bucket_traits &priv_bucket_traits()
732
- { return this->data.bucket_traits_; }
1032
+ BOOST_INTRUSIVE_FORCEINLINE bucket_traits& priv_bucket_traits()
1033
+ { return static_cast<bucket_traits&>(this->m_data); }
733
1034
 
734
1035
  //bucket operations
735
- BOOST_INTRUSIVE_FORCEINLINE bucket_ptr priv_bucket_pointer() const
1036
+ BOOST_INTRUSIVE_FORCEINLINE bucket_ptr priv_bucket_pointer() const BOOST_NOEXCEPT
736
1037
  { return this->priv_bucket_traits().bucket_begin(); }
737
1038
 
738
- std::size_t priv_bucket_count() const
739
- { return this->priv_bucket_traits().bucket_count(); }
1039
+ BOOST_INTRUSIVE_FORCEINLINE std::size_t priv_usable_bucket_count() const BOOST_NOEXCEPT
1040
+ {
1041
+ BOOST_IF_CONSTEXPR(bucket_overhead){
1042
+ const std::size_t n = this->priv_bucket_traits().bucket_count();
1043
+ return n - std::size_t(n != 0)*bucket_overhead;
1044
+ }
1045
+ else{
1046
+ return this->priv_bucket_traits().bucket_count();
1047
+ }
1048
+ }
740
1049
 
741
- BOOST_INTRUSIVE_FORCEINLINE bucket_ptr priv_invalid_bucket() const
1050
+ BOOST_INTRUSIVE_FORCEINLINE bucket_type &priv_bucket(std::size_t n) const BOOST_NOEXCEPT
742
1051
  {
743
- const bucket_traits &rbt = this->priv_bucket_traits();
744
- return rbt.bucket_begin() + rbt.bucket_count();
1052
+ BOOST_INTRUSIVE_INVARIANT_ASSERT(n < this->priv_usable_bucket_count());
1053
+ return this->priv_bucket_pointer()[std::ptrdiff_t(n)];
745
1054
  }
746
1055
 
747
- BOOST_INTRUSIVE_FORCEINLINE siterator priv_invalid_local_it() const
748
- { return this->priv_bucket_traits().bucket_begin()->before_begin(); }
1056
+ BOOST_INTRUSIVE_FORCEINLINE bucket_ptr priv_bucket_ptr(std::size_t n) const BOOST_NOEXCEPT
1057
+ { return pointer_traits<bucket_ptr>::pointer_to(this->priv_bucket(n)); }
1058
+
1059
+ BOOST_INTRUSIVE_FORCEINLINE bucket_ptr priv_past_usable_bucket_ptr() const
1060
+ { return this->priv_bucket_pointer() + std::ptrdiff_t(priv_usable_bucket_count()); }
1061
+
1062
+ BOOST_INTRUSIVE_FORCEINLINE bucket_ptr priv_invalid_bucket_ptr() const
1063
+ {
1064
+ BOOST_IF_CONSTEXPR(LinearBuckets) {
1065
+ return bucket_ptr();
1066
+ }
1067
+ else{
1068
+ return this->priv_past_usable_bucket_ptr();
1069
+ }
1070
+ }
1071
+
1072
+ BOOST_INTRUSIVE_FORCEINLINE void priv_set_sentinel_bucket() const
1073
+ {
1074
+ BOOST_IF_CONSTEXPR(LinearBuckets) {
1075
+ BOOST_INTRUSIVE_INVARIANT_ASSERT(this->priv_bucket_traits().bucket_count() > 1);
1076
+ bucket_type &b = this->priv_bucket_pointer()[std::ptrdiff_t(this->priv_usable_bucket_count())];
1077
+ slist_node_algorithms::set_sentinel(b.get_node_ptr());
1078
+ }
1079
+ }
1080
+
1081
+ BOOST_INTRUSIVE_FORCEINLINE void priv_unset_sentinel_bucket() const
1082
+ {
1083
+ BOOST_IF_CONSTEXPR(LinearBuckets) {
1084
+ BOOST_INTRUSIVE_INVARIANT_ASSERT(this->priv_bucket_traits().bucket_count() > 1);
1085
+ bucket_type& b = this->priv_bucket_pointer()[std::ptrdiff_t(this->priv_usable_bucket_count())];
1086
+ slist_node_algorithms::init_header(b.get_node_ptr());
1087
+ }
1088
+ }
1089
+
1090
+ BOOST_INTRUSIVE_FORCEINLINE siterator priv_end_sit() const
1091
+ { return priv_end_sit(linear_buckets_t()); }
1092
+
1093
+ BOOST_INTRUSIVE_FORCEINLINE siterator priv_end_sit(detail::true_) const
1094
+ { return siterator(this->priv_bucket_pointer() + std::ptrdiff_t(this->priv_bucket_traits().bucket_count() - bucket_overhead)); }
1095
+
1096
+ BOOST_INTRUSIVE_FORCEINLINE siterator priv_end_sit(detail::false_) const
1097
+ { return siterator(this->priv_bucket_pointer()->get_node_ptr()); }
1098
+
1099
+ BOOST_INTRUSIVE_FORCEINLINE siterator priv_bucket_lbegin(std::size_t n) const
1100
+ { siterator s(this->priv_bucket_lbbegin(n)); return ++s; }
1101
+
1102
+ BOOST_INTRUSIVE_FORCEINLINE siterator priv_bucket_lbbegin(std::size_t n) const
1103
+ { return this->sit_bbegin(this->priv_bucket(n)); }
1104
+
1105
+ BOOST_INTRUSIVE_FORCEINLINE siterator priv_bucket_lend(std::size_t n) const
1106
+ { return this->sit_end(this->priv_bucket(n)); }
1107
+
1108
+ BOOST_INTRUSIVE_FORCEINLINE std::size_t priv_bucket_size(std::size_t n) const
1109
+ { return slist_node_algorithms::count(this->priv_bucket(n).get_node_ptr())-1u; }
1110
+
1111
+ BOOST_INTRUSIVE_FORCEINLINE bool priv_bucket_empty(std::size_t n) const
1112
+ { return slist_node_algorithms::is_empty(this->priv_bucket(n).get_node_ptr()); }
1113
+
1114
+ BOOST_INTRUSIVE_FORCEINLINE bool priv_bucket_empty(bucket_ptr p) const
1115
+ { return slist_node_algorithms::is_empty(p->get_node_ptr()); }
1116
+
1117
+ static BOOST_INTRUSIVE_FORCEINLINE siterator priv_bucket_lbegin(bucket_type &b)
1118
+ { return siterator(slist_node_traits::get_next(b.get_node_ptr())); }
1119
+
1120
+ static BOOST_INTRUSIVE_FORCEINLINE siterator priv_bucket_lbbegin(bucket_type& b)
1121
+ { return siterator(b.get_node_ptr()); }
1122
+
1123
+ static BOOST_INTRUSIVE_FORCEINLINE siterator priv_bucket_lend(bucket_type& b)
1124
+ { return siterator(slist_node_algorithms::end_node(b.get_node_ptr())); }
1125
+
1126
+ static BOOST_INTRUSIVE_FORCEINLINE std::size_t priv_bucket_size(const bucket_type& b)
1127
+ { return slist_node_algorithms::count(b.get_node_ptr())-1u; }
1128
+
1129
+ static BOOST_INTRUSIVE_FORCEINLINE bool priv_bucket_empty(const bucket_type& b)
1130
+ { return slist_node_algorithms::is_empty(b.get_node_ptr()); }
749
1131
 
750
1132
  template<class NodeDisposer>
751
- static std::size_t priv_erase_from_single_bucket(bucket_type &b, siterator sbefore_first, siterator slast, NodeDisposer node_disposer, detail::true_) //optimize multikey
1133
+ static std::size_t priv_erase_from_single_bucket
1134
+ (bucket_type &b, siterator sbefore_first, siterator slast, NodeDisposer node_disposer, detail::true_) //optimize multikey
752
1135
  {
753
1136
  std::size_t n = 0;
754
1137
  siterator const sfirst(++siterator(sbefore_first));
755
1138
  if(sfirst != slast){
756
- node_ptr const nf = detail::dcast_bucket_ptr<node>(sfirst.pointed_node());
757
- node_ptr const nl = detail::dcast_bucket_ptr<node>(slast.pointed_node());
758
- node_ptr const ne = detail::dcast_bucket_ptr<node>(b.end().pointed_node());
1139
+ node_ptr const nf = dcast_bucket_ptr<node>(sfirst.pointed_node());
1140
+ node_ptr const nl = dcast_bucket_ptr<node>(slast.pointed_node());
1141
+ slist_node_ptr const ne = (priv_bucket_lend(b)).pointed_node();
759
1142
 
760
- if(group_functions_t::next_group_if_first_in_group(nf) != nf) {
761
- // The node is at the beginning of a group.
1143
+ if(group_functions_t::is_first_in_group(nf)) {
1144
+ // The first node is at the beginning of a group.
762
1145
  if(nl != ne){
763
1146
  group_functions_t::split_group(nl);
764
1147
  }
@@ -766,52 +1149,42 @@ struct bucket_plus_vtraits
766
1149
  else {
767
1150
  node_ptr const group1 = group_functions_t::split_group(nf);
768
1151
  if(nl != ne) {
769
- node_ptr const group2 = group_functions_t::split_group(ne);
1152
+ node_ptr const group2 = group_functions_t::split_group(nl);
770
1153
  if(nf == group2) { //Both first and last in the same group
771
1154
  //so join group1 and group2
772
1155
  node_ptr const end1 = group_traits::get_next(group1);
773
1156
  node_ptr const end2 = group_traits::get_next(group2);
774
1157
  group_traits::set_next(group1, end2);
775
- group_traits::set_next(group2, end1);
1158
+ group_traits::set_next(nl, end1);
776
1159
  }
777
1160
  }
778
1161
  }
779
1162
 
780
- siterator it(++siterator(sbefore_first));
781
- while(it != slast){
782
- node_disposer((it++).pointed_node());
783
- ++n;
784
- }
785
- b.erase_after(sbefore_first, slast);
1163
+ n = slist_node_algorithms::unlink_after_and_dispose(sbefore_first.pointed_node(), slast.pointed_node(), node_disposer);
786
1164
  }
787
1165
  return n;
788
1166
  }
789
1167
 
790
1168
  template<class NodeDisposer>
791
- static std::size_t priv_erase_from_single_bucket(bucket_type &b, siterator sbefore_first, siterator slast, NodeDisposer node_disposer, detail::false_) //optimize multikey
1169
+ static std::size_t priv_erase_from_single_bucket
1170
+ (bucket_type &, siterator sbefore_first, siterator slast, NodeDisposer node_disposer, detail::false_) //optimize multikey
792
1171
  {
793
- std::size_t n = 0;
794
- siterator it(++siterator(sbefore_first));
795
- while(it != slast){
796
- node_disposer((it++).pointed_node());
797
- ++n;
798
- }
799
- b.erase_after(sbefore_first, slast);
800
- return n;
1172
+ return slist_node_algorithms::unlink_after_and_dispose(sbefore_first.pointed_node(), slast.pointed_node(), node_disposer);
801
1173
  }
802
1174
 
803
1175
  template<class NodeDisposer>
804
1176
  static void priv_erase_node(bucket_type &b, siterator i, NodeDisposer node_disposer, detail::true_) //optimize multikey
805
1177
  {
806
- node_ptr const ne(detail::dcast_bucket_ptr<node>(b.end().pointed_node()));
807
- node_ptr n(detail::dcast_bucket_ptr<node>(i.pointed_node()));
1178
+ slist_node_ptr const ne(priv_bucket_lend(b).pointed_node());
1179
+ slist_node_ptr const nbb(priv_bucket_lbbegin(b).pointed_node());
1180
+ node_ptr n(dcast_bucket_ptr<node>(i.pointed_node()));
808
1181
  node_ptr pos = node_traits::get_next(group_traits::get_next(n));
809
1182
  node_ptr bn;
810
1183
  node_ptr nn(node_traits::get_next(n));
811
1184
 
812
1185
  if(pos != n) {
813
1186
  //Node is the first of the group
814
- bn = group_functions_t::get_prev_to_first_in_group(ne, n);
1187
+ bn = group_functions_t::get_prev_to_first_in_group(nbb, n);
815
1188
 
816
1189
  //Unlink the rest of the group if it's not the last node of its group
817
1190
  if(nn != ne && group_traits::get_next(nn) == n){
@@ -829,12 +1202,15 @@ struct bucket_plus_vtraits
829
1202
  node_ptr const x(group_algorithms::get_previous_node(n));
830
1203
  group_algorithms::unlink_after(x);
831
1204
  }
832
- b.erase_after_and_dispose(bucket_type::s_iterator_to(*bn), node_disposer);
1205
+ slist_node_algorithms::unlink_after_and_dispose(bn, node_disposer);
833
1206
  }
834
1207
 
835
1208
  template<class NodeDisposer>
836
- BOOST_INTRUSIVE_FORCEINLINE static void priv_erase_node(bucket_type &b, siterator i, NodeDisposer node_disposer, detail::false_) //optimize multikey
837
- { b.erase_after_and_dispose(b.previous(i), node_disposer); }
1209
+ BOOST_INTRUSIVE_FORCEINLINE static void priv_erase_node(bucket_type &b, siterator i, NodeDisposer node_disposer, detail::false_) //!optimize multikey
1210
+ {
1211
+ slist_node_ptr bi = slist_node_algorithms::get_previous_node(b.get_node_ptr(), i.pointed_node());
1212
+ slist_node_algorithms::unlink_after_and_dispose(bi, node_disposer);
1213
+ }
838
1214
 
839
1215
  template<class NodeDisposer, bool OptimizeMultikey>
840
1216
  std::size_t priv_erase_node_range( siterator const &before_first_it, std::size_t const first_bucket
@@ -844,19 +1220,19 @@ struct bucket_plus_vtraits
844
1220
  std::size_t num_erased(0);
845
1221
  siterator last_step_before_it;
846
1222
  if(first_bucket != last_bucket){
847
- bucket_type *b = (&this->priv_bucket_pointer()[0]);
1223
+ bucket_type *b = &this->priv_bucket(0);
848
1224
  num_erased += this->priv_erase_from_single_bucket
849
- (b[first_bucket], before_first_it, b[first_bucket].end(), node_disposer, optimize_multikey_tag);
1225
+ (b[first_bucket], before_first_it, this->priv_bucket_lend(first_bucket), node_disposer, optimize_multikey_tag);
850
1226
  for(std::size_t i = 0, n = (last_bucket - first_bucket - 1); i != n; ++i){
851
1227
  num_erased += this->priv_erase_whole_bucket(b[first_bucket+i+1], node_disposer);
852
1228
  }
853
- last_step_before_it = b[last_bucket].before_begin();
1229
+ last_step_before_it = this->priv_bucket_lbbegin(last_bucket);
854
1230
  }
855
1231
  else{
856
1232
  last_step_before_it = before_first_it;
857
1233
  }
858
1234
  num_erased += this->priv_erase_from_single_bucket
859
- (this->priv_bucket_pointer()[last_bucket], last_step_before_it, last_it, node_disposer, optimize_multikey_tag);
1235
+ (this->priv_bucket(last_bucket), last_step_before_it, last_it, node_disposer, optimize_multikey_tag);
860
1236
  return num_erased;
861
1237
  }
862
1238
 
@@ -865,88 +1241,74 @@ struct bucket_plus_vtraits
865
1241
  //First find the last node of p's group.
866
1242
  //This requires checking the first node of the next group or
867
1243
  //the bucket node.
868
- slist_node_ptr end_ptr(b.end().pointed_node());
869
- node_ptr possible_end(node_traits::get_next( detail::dcast_bucket_ptr<node>(end_ptr)));
870
- node_ptr last_node_group(possible_end);
1244
+ slist_node_ptr end_ptr(sit_end(b).pointed_node());
1245
+ slist_node_ptr last_node_group(b.get_node_ptr());
1246
+ slist_node_ptr possible_end(slist_node_traits::get_next(last_node_group));
871
1247
 
872
1248
  while(end_ptr != possible_end){
873
- last_node_group = group_traits::get_next(detail::dcast_bucket_ptr<node>(possible_end));
874
- possible_end = node_traits::get_next(last_node_group);
1249
+ last_node_group = group_traits::get_next(dcast_bucket_ptr<node>(possible_end));
1250
+ possible_end = slist_node_traits::get_next(last_node_group);
875
1251
  }
876
- return bucket_type::s_iterator_to(*last_node_group);
1252
+ return siterator(last_node_group);
877
1253
  }
878
1254
 
879
- template<class NodeDisposer>
880
- std::size_t priv_erase_whole_bucket(bucket_type &b, NodeDisposer node_disposer)
881
- {
882
- std::size_t num_erased = 0;
883
- siterator b_begin(b.before_begin());
884
- siterator nxt(b_begin);
885
- ++nxt;
886
- siterator const end_sit(b.end());
887
- while(nxt != end_sit){
888
- //No need to init group links as we'll delete all bucket nodes
889
- nxt = bucket_type::s_erase_after_and_dispose(b_begin, node_disposer);
890
- ++num_erased;
891
- }
892
- return num_erased;
1255
+ BOOST_INTRUSIVE_FORCEINLINE static siterator priv_get_last(bucket_type &b, detail::false_) //NOT optimize multikey
1256
+ {
1257
+ slist_node_ptr p = b.get_node_ptr();
1258
+ return siterator(slist_node_algorithms::get_previous_node(p, slist_node_algorithms::end_node(p)));
893
1259
  }
894
1260
 
895
- BOOST_INTRUSIVE_FORCEINLINE static siterator priv_get_last(bucket_type &b, detail::false_) //NOT optimize multikey
896
- { return b.previous(b.end()); }
1261
+ template<class NodeDisposer>
1262
+ static BOOST_INTRUSIVE_FORCEINLINE std::size_t priv_erase_whole_bucket(bucket_type &b, NodeDisposer node_disposer)
1263
+ { return slist_node_algorithms::detach_and_dispose(b.get_node_ptr(), node_disposer); }
897
1264
 
898
1265
  static siterator priv_get_previous(bucket_type &b, siterator i, detail::true_) //optimize multikey
899
1266
  {
900
- node_ptr const elem(detail::dcast_bucket_ptr<node>(i.pointed_node()));
1267
+ node_ptr const elem(dcast_bucket_ptr<node>(i.pointed_node()));
901
1268
  node_ptr const prev_in_group(group_traits::get_next(elem));
902
1269
  bool const first_in_group = node_traits::get_next(prev_in_group) != elem;
903
- typename bucket_type::node &n = first_in_group
904
- ? *group_functions_t::get_prev_to_first_in_group(b.end().pointed_node(), elem)
905
- : *group_traits::get_next(elem)
1270
+ slist_node_ptr n = first_in_group
1271
+ ? group_functions_t::get_prev_to_first_in_group(b.get_node_ptr(), elem)
1272
+ : group_traits::get_next(elem)
906
1273
  ;
907
- return bucket_type::s_iterator_to(n);
1274
+ return siterator(n);
908
1275
  }
909
1276
 
910
1277
  BOOST_INTRUSIVE_FORCEINLINE static siterator priv_get_previous(bucket_type &b, siterator i, detail::false_) //NOT optimize multikey
911
- { return b.previous(i); }
1278
+ { return siterator(slist_node_algorithms::get_previous_node(b.get_node_ptr(), i.pointed_node())); }
912
1279
 
913
- std::size_t priv_get_bucket_num_no_hash_store(siterator it, detail::true_) //optimize multikey
1280
+ template<class Disposer>
1281
+ struct typeof_node_disposer
914
1282
  {
915
- const bucket_ptr f(this->priv_bucket_pointer()), l(f + this->priv_bucket_count() - 1);
916
- slist_node_ptr bb = group_functions_t::get_bucket_before_begin
917
- ( f->end().pointed_node()
918
- , l->end().pointed_node()
919
- , detail::dcast_bucket_ptr<node>(it.pointed_node()));
920
- //Now get the bucket_impl from the iterator
921
- const bucket_type &b = static_cast<const bucket_type&>
922
- (bucket_type::slist_type::container_from_end_iterator(bucket_type::s_iterator_to(*bb)));
923
- //Now just calculate the index b has in the bucket array
924
- return static_cast<std::size_t>(&b - &*f);
925
- }
1283
+ typedef node_cast_adaptor
1284
+ < detail::node_disposer< Disposer, value_traits, CommonSListAlgorithms>
1285
+ , slist_node_ptr, node_ptr > type;
1286
+ };
926
1287
 
927
- std::size_t priv_get_bucket_num_no_hash_store(siterator it, detail::false_) //NO optimize multikey
1288
+ template<class Disposer>
1289
+ BOOST_INTRUSIVE_FORCEINLINE typename typeof_node_disposer<Disposer>::type
1290
+ make_node_disposer(const Disposer &disposer) const
928
1291
  {
929
- bucket_ptr f(this->priv_bucket_pointer()), l(f + this->priv_bucket_count() - 1);
930
- slist_node_ptr first_ptr(f->cend().pointed_node())
931
- , last_ptr(l->cend().pointed_node());
1292
+ typedef typename typeof_node_disposer<Disposer>::type return_t;
1293
+ return return_t(disposer, &this->priv_value_traits());
1294
+ }
932
1295
 
933
- //The end node is embedded in the singly linked list:
934
- //iterate until we reach it.
935
- while(!(first_ptr <= it.pointed_node() && it.pointed_node() <= last_ptr)){
936
- ++it;
937
- }
938
- //Now get the bucket_impl from the iterator
939
- const bucket_type &b = static_cast<const bucket_type&>
940
- (bucket_type::container_from_end_iterator(it));
1296
+ static BOOST_INTRUSIVE_FORCEINLINE bucket_ptr to_ptr(bucket_type &b)
1297
+ { return pointer_traits<bucket_ptr>::pointer_to(b); }
941
1298
 
942
- //Now just calculate the index b has in the bucket array
943
- return static_cast<std::size_t>(&b - &*f);
944
- }
1299
+ static BOOST_INTRUSIVE_FORCEINLINE siterator sit_bbegin(bucket_type& b)
1300
+ { return siterator(b.get_node_ptr()); }
1301
+
1302
+ static BOOST_INTRUSIVE_FORCEINLINE siterator sit_begin(bucket_type& b)
1303
+ { return siterator(b.begin_ptr()); }
945
1304
 
946
- BOOST_INTRUSIVE_FORCEINLINE static std::size_t priv_stored_hash(slist_node_ptr n, detail::true_) //store_hash
947
- { return node_traits::get_hash(detail::dcast_bucket_ptr<node>(n)); }
1305
+ static BOOST_INTRUSIVE_FORCEINLINE siterator sit_end(bucket_type& b)
1306
+ { return siterator(slist_node_algorithms::end_node(b.get_node_ptr())); }
948
1307
 
949
- BOOST_INTRUSIVE_FORCEINLINE static std::size_t priv_stored_hash(slist_node_ptr, detail::false_) //NO store_hash
1308
+ BOOST_INTRUSIVE_FORCEINLINE static std::size_t priv_stored_hash(siterator s, detail::true_) //store_hash
1309
+ { return node_traits::get_hash(dcast_bucket_ptr<node>(s.pointed_node())); }
1310
+
1311
+ BOOST_INTRUSIVE_FORCEINLINE static std::size_t priv_stored_hash(siterator, detail::false_) //NO store_hash
950
1312
  { return std::size_t(-1); }
951
1313
 
952
1314
  BOOST_INTRUSIVE_FORCEINLINE node &priv_value_to_node(reference v)
@@ -955,21 +1317,36 @@ struct bucket_plus_vtraits
955
1317
  BOOST_INTRUSIVE_FORCEINLINE const node &priv_value_to_node(const_reference v) const
956
1318
  { return *this->priv_value_traits().to_node_ptr(v); }
957
1319
 
958
- BOOST_INTRUSIVE_FORCEINLINE reference priv_value_from_slist_node(slist_node_ptr n)
959
- { return *this->priv_value_traits().to_value_ptr(detail::dcast_bucket_ptr<node>(n)); }
1320
+ BOOST_INTRUSIVE_FORCEINLINE node_ptr priv_value_to_node_ptr(reference v)
1321
+ { return this->priv_value_traits().to_node_ptr(v); }
1322
+
1323
+ BOOST_INTRUSIVE_FORCEINLINE const_node_ptr priv_value_to_node_ptr(const_reference v) const
1324
+ { return this->priv_value_traits().to_node_ptr(v); }
960
1325
 
961
- BOOST_INTRUSIVE_FORCEINLINE const_reference priv_value_from_slist_node(slist_node_ptr n) const
962
- { return *this->priv_value_traits().to_value_ptr(detail::dcast_bucket_ptr<node>(n)); }
1326
+ BOOST_INTRUSIVE_FORCEINLINE reference priv_value_from_siterator(siterator s)
1327
+ { return *this->priv_value_traits().to_value_ptr(dcast_bucket_ptr<node>(s.pointed_node())); }
1328
+
1329
+ BOOST_INTRUSIVE_FORCEINLINE const_reference priv_value_from_siterator(siterator s) const
1330
+ { return *this->priv_value_traits().to_value_ptr(dcast_bucket_ptr<node>(s.pointed_node())); }
1331
+
1332
+ static void priv_init_buckets(const bucket_ptr buckets_ptr, const std::size_t bucket_cnt)
1333
+ {
1334
+ bucket_ptr buckets_it = buckets_ptr;
1335
+ for (std::size_t bucket_i = 0; bucket_i != bucket_cnt; ++buckets_it, ++bucket_i) {
1336
+ slist_node_algorithms::init_header(buckets_it->get_node_ptr());
1337
+ }
1338
+ }
963
1339
 
964
1340
  void priv_clear_buckets(const bucket_ptr buckets_ptr, const std::size_t bucket_cnt)
965
1341
  {
966
1342
  bucket_ptr buckets_it = buckets_ptr;
967
1343
  for(std::size_t bucket_i = 0; bucket_i != bucket_cnt; ++buckets_it, ++bucket_i){
968
- if(safemode_or_autounlink){
969
- buckets_it->clear_and_dispose(detail::init_disposer<node_algorithms>());
1344
+ bucket_type &b = *buckets_it;
1345
+ BOOST_IF_CONSTEXPR(safemode_or_autounlink){
1346
+ slist_node_algorithms::detach_and_dispose(b.get_node_ptr(), this->make_node_disposer(detail::null_disposer()));
970
1347
  }
971
1348
  else{
972
- buckets_it->clear();
1349
+ slist_node_algorithms::init_header(b.get_node_ptr());
973
1350
  }
974
1351
  }
975
1352
  }
@@ -977,28 +1354,35 @@ struct bucket_plus_vtraits
977
1354
  BOOST_INTRUSIVE_FORCEINLINE std::size_t priv_stored_or_compute_hash(const value_type &v, detail::true_) const //For store_hash == true
978
1355
  { return node_traits::get_hash(this->priv_value_traits().to_node_ptr(v)); }
979
1356
 
980
- typedef hashtable_iterator<bucket_plus_vtraits, false> iterator;
981
- typedef hashtable_iterator<bucket_plus_vtraits, true> const_iterator;
1357
+ typedef hashtable_iterator<bucket_plus_vtraits, LinearBuckets, false> iterator;
1358
+ typedef hashtable_iterator<bucket_plus_vtraits, LinearBuckets, true> const_iterator;
982
1359
 
983
- BOOST_INTRUSIVE_FORCEINLINE iterator end()
984
- { return iterator(this->priv_invalid_local_it(), 0); }
1360
+ BOOST_INTRUSIVE_FORCEINLINE iterator end() BOOST_NOEXCEPT
1361
+ { return this->build_iterator(this->priv_end_sit(), bucket_ptr()); }
985
1362
 
986
- BOOST_INTRUSIVE_FORCEINLINE const_iterator end() const
987
- { return this->cend(); }
1363
+ BOOST_INTRUSIVE_FORCEINLINE const_iterator end() const BOOST_NOEXCEPT
1364
+ { return this->cend(); }
988
1365
 
989
- BOOST_INTRUSIVE_FORCEINLINE const_iterator cend() const
990
- { return const_iterator(this->priv_invalid_local_it(), 0); }
1366
+ BOOST_INTRUSIVE_FORCEINLINE const_iterator cend() const BOOST_NOEXCEPT
1367
+ { return this->build_const_iterator(this->priv_end_sit(), bucket_ptr()); }
991
1368
 
992
- //Public functions:
993
- struct data_type : public ValueTraits
994
- {
995
- template<class BucketTraitsType>
996
- BOOST_INTRUSIVE_FORCEINLINE data_type(const ValueTraits &val_traits, BOOST_FWD_REF(BucketTraitsType) b_traits)
997
- : ValueTraits(val_traits), bucket_traits_(::boost::forward<BucketTraitsType>(b_traits))
998
- {}
1369
+ BOOST_INTRUSIVE_FORCEINLINE iterator build_iterator(siterator s, bucket_ptr p)
1370
+ { return this->build_iterator(s, p, linear_buckets_t()); }
1371
+
1372
+ BOOST_INTRUSIVE_FORCEINLINE iterator build_iterator(siterator s, bucket_ptr p, detail::true_) //linear buckets
1373
+ { return iterator(s, p, this->priv_value_traits_ptr()); }
1374
+
1375
+ BOOST_INTRUSIVE_FORCEINLINE iterator build_iterator(siterator s, bucket_ptr, detail::false_) //!linear buckets
1376
+ { return iterator(s, &this->get_bucket_value_traits()); }
1377
+
1378
+ BOOST_INTRUSIVE_FORCEINLINE const_iterator build_const_iterator(siterator s, bucket_ptr p) const
1379
+ { return this->build_const_iterator(s, p, linear_buckets_t()); }
999
1380
 
1000
- bucket_traits bucket_traits_;
1001
- } data;
1381
+ BOOST_INTRUSIVE_FORCEINLINE const_iterator build_const_iterator(siterator s, bucket_ptr p, detail::true_) const //linear buckets
1382
+ { return const_iterator(s, p, this->priv_value_traits_ptr()); }
1383
+
1384
+ BOOST_INTRUSIVE_FORCEINLINE const_iterator build_const_iterator(siterator s, bucket_ptr, detail::false_) const //!linear buckets
1385
+ { return const_iterator(s, &this->get_bucket_value_traits()); }
1002
1386
  };
1003
1387
 
1004
1388
  template<class Hash, class>
@@ -1022,7 +1406,7 @@ struct get_equal_to
1022
1406
  template<class T>
1023
1407
  struct get_equal_to<void, T>
1024
1408
  {
1025
- typedef std::equal_to<T> type;
1409
+ typedef value_equal<T> type;
1026
1410
  };
1027
1411
 
1028
1412
  template<class KeyOfValue, class T>
@@ -1064,18 +1448,24 @@ struct hash_key_equal
1064
1448
 
1065
1449
  //bucket_hash_t
1066
1450
  //Stores bucket_plus_vtraits plust the hash function
1067
- template<class ValueTraits, class VoidOrKeyOfValue, class VoidOrKeyHash, class BucketTraits>
1451
+ template<class ValueTraits, class VoidOrKeyOfValue, class VoidOrKeyHash, class BucketTraits, bool LinearBuckets>
1068
1452
  struct bucket_hash_t
1069
1453
  //Use public inheritance to avoid MSVC bugs with closures
1070
1454
  : public detail::ebo_functor_holder
1071
- <typename hash_key_hash < typename bucket_plus_vtraits<ValueTraits,BucketTraits>::value_traits::value_type
1455
+ <typename hash_key_hash < typename bucket_plus_vtraits<ValueTraits,BucketTraits, LinearBuckets >::value_traits::value_type
1072
1456
  , VoidOrKeyOfValue
1073
1457
  , VoidOrKeyHash
1074
1458
  >::type
1075
1459
  >
1076
- , bucket_plus_vtraits<ValueTraits, BucketTraits> //4
1460
+ , bucket_plus_vtraits<ValueTraits, BucketTraits, LinearBuckets> //4
1077
1461
  {
1078
- typedef typename bucket_plus_vtraits<ValueTraits,BucketTraits>::value_traits value_traits;
1462
+ private:
1463
+ BOOST_MOVABLE_BUT_NOT_COPYABLE(bucket_hash_t)
1464
+
1465
+ public:
1466
+
1467
+ typedef typename bucket_plus_vtraits
1468
+ <ValueTraits,BucketTraits, LinearBuckets>::value_traits value_traits;
1079
1469
  typedef typename value_traits::value_type value_type;
1080
1470
  typedef typename value_traits::node_traits node_traits;
1081
1471
  typedef hash_key_hash
@@ -1084,18 +1474,27 @@ struct bucket_hash_t
1084
1474
  typedef typename hash_key_types_base<value_type, VoidOrKeyOfValue>::key_of_value key_of_value;
1085
1475
 
1086
1476
  typedef BucketTraits bucket_traits;
1087
- typedef bucket_plus_vtraits<ValueTraits, BucketTraits> bucket_plus_vtraits_t;
1477
+ typedef bucket_plus_vtraits<ValueTraits, BucketTraits, LinearBuckets> bucket_plus_vtraits_t;
1088
1478
  typedef detail::ebo_functor_holder<hasher> base_t;
1089
1479
 
1090
- template<class BucketTraitsType>
1091
- BOOST_INTRUSIVE_FORCEINLINE bucket_hash_t(const ValueTraits &val_traits, BOOST_FWD_REF(BucketTraitsType) b_traits, const hasher & h)
1092
- : detail::ebo_functor_holder<hasher>(h), bucket_plus_vtraits_t(val_traits, ::boost::forward<BucketTraitsType>(b_traits))
1480
+ BOOST_INTRUSIVE_FORCEINLINE bucket_hash_t(const ValueTraits &val_traits, const bucket_traits &b_traits, const hasher & h)
1481
+ : base_t(h)
1482
+ , bucket_plus_vtraits_t(val_traits, b_traits)
1483
+ {}
1484
+
1485
+ BOOST_INTRUSIVE_FORCEINLINE bucket_hash_t(BOOST_RV_REF(bucket_hash_t) other)
1486
+ : base_t(BOOST_MOVE_BASE(base_t, other))
1487
+ , bucket_plus_vtraits_t(BOOST_MOVE_BASE(bucket_plus_vtraits_t, other))
1093
1488
  {}
1094
1489
 
1490
+ template<class K>
1491
+ BOOST_INTRUSIVE_FORCEINLINE std::size_t priv_hash(const K &k) const
1492
+ { return this->base_t::operator()(k); }
1493
+
1095
1494
  BOOST_INTRUSIVE_FORCEINLINE const hasher &priv_hasher() const
1096
1495
  { return this->base_t::get(); }
1097
1496
 
1098
- hasher &priv_hasher()
1497
+ BOOST_INTRUSIVE_FORCEINLINE hasher &priv_hasher()
1099
1498
  { return this->base_t::get(); }
1100
1499
 
1101
1500
  using bucket_plus_vtraits_t::priv_stored_or_compute_hash; //For store_hash == true
@@ -1104,11 +1503,12 @@ struct bucket_hash_t
1104
1503
  { return this->priv_hasher()(key_of_value()(v)); }
1105
1504
  };
1106
1505
 
1107
- template<class ValueTraits, class BucketTraits, class VoidOrKeyOfValue, class VoidOrKeyEqual>
1506
+ template<class ValueTraits, class BucketTraits, class VoidOrKeyOfValue, class VoidOrKeyEqual, bool LinearBuckets>
1108
1507
  struct hashtable_equal_holder
1109
1508
  {
1110
1509
  typedef detail::ebo_functor_holder
1111
- < typename hash_key_equal < typename bucket_plus_vtraits<ValueTraits, BucketTraits>::value_traits::value_type
1510
+ < typename hash_key_equal < typename bucket_plus_vtraits
1511
+ <ValueTraits, BucketTraits, LinearBuckets>::value_traits::value_type
1112
1512
  , VoidOrKeyOfValue
1113
1513
  , VoidOrKeyEqual
1114
1514
  >::type
@@ -1119,57 +1519,76 @@ struct hashtable_equal_holder
1119
1519
  //bucket_hash_equal_t
1120
1520
  //Stores bucket_hash_t and the equality function when the first
1121
1521
  //non-empty bucket shall not be cached.
1122
- template<class ValueTraits, class VoidOrKeyOfValue, class VoidOrKeyHash, class VoidOrKeyEqual, class BucketTraits, bool>
1522
+ template<class ValueTraits, class VoidOrKeyOfValue, class VoidOrKeyHash, class VoidOrKeyEqual, class BucketTraits, bool LinearBuckets, bool>
1123
1523
  struct bucket_hash_equal_t
1124
1524
  //Use public inheritance to avoid MSVC bugs with closures
1125
- : public bucket_hash_t<ValueTraits, VoidOrKeyOfValue, VoidOrKeyHash, BucketTraits> //3
1126
- , public hashtable_equal_holder<ValueTraits, BucketTraits, VoidOrKeyOfValue, VoidOrKeyEqual>::type //equal
1525
+ : public bucket_hash_t<ValueTraits, VoidOrKeyOfValue, VoidOrKeyHash, BucketTraits, LinearBuckets> //3
1526
+ , public hashtable_equal_holder<ValueTraits, BucketTraits, VoidOrKeyOfValue, VoidOrKeyEqual, LinearBuckets>::type //equal
1127
1527
  {
1528
+ private:
1529
+ BOOST_MOVABLE_BUT_NOT_COPYABLE(bucket_hash_equal_t)
1530
+
1531
+ public:
1128
1532
  typedef typename hashtable_equal_holder
1129
- <ValueTraits, BucketTraits, VoidOrKeyOfValue, VoidOrKeyEqual>::type equal_holder_t;
1130
- typedef bucket_hash_t<ValueTraits, VoidOrKeyOfValue, VoidOrKeyHash, BucketTraits> bucket_hash_type;
1131
- typedef bucket_plus_vtraits<ValueTraits,BucketTraits> bucket_plus_vtraits_t;
1132
- typedef ValueTraits value_traits;
1133
- typedef typename equal_holder_t::functor_type key_equal;
1134
- typedef typename bucket_hash_type::hasher hasher;
1135
- typedef BucketTraits bucket_traits;
1136
- typedef typename bucket_plus_vtraits_t::slist_impl slist_impl;
1137
- typedef typename slist_impl::iterator siterator;
1138
- typedef bucket_impl<slist_impl> bucket_type;
1139
- typedef typename detail::unordered_bucket_ptr_impl<value_traits>::type bucket_ptr;
1140
-
1141
- template<class BucketTraitsType>
1142
- bucket_hash_equal_t(const ValueTraits &val_traits, BOOST_FWD_REF(BucketTraitsType) b_traits, const hasher & h, const key_equal &e)
1143
- : bucket_hash_type(val_traits, ::boost::forward<BucketTraitsType>(b_traits), h)
1533
+ < ValueTraits, BucketTraits, VoidOrKeyOfValue
1534
+ , VoidOrKeyEqual, LinearBuckets>::type equal_holder_t;
1535
+ typedef bucket_hash_t< ValueTraits, VoidOrKeyOfValue
1536
+ , VoidOrKeyHash, BucketTraits
1537
+ , LinearBuckets> bucket_hash_type;
1538
+ typedef bucket_plus_vtraits
1539
+ <ValueTraits, BucketTraits, LinearBuckets> bucket_plus_vtraits_t;
1540
+ typedef ValueTraits value_traits;
1541
+ typedef typename equal_holder_t::functor_type key_equal;
1542
+ typedef typename bucket_hash_type::hasher hasher;
1543
+ typedef BucketTraits bucket_traits;
1544
+ typedef typename bucket_plus_vtraits_t::siterator siterator;
1545
+ typedef typename bucket_plus_vtraits_t::const_siterator const_siterator;
1546
+ typedef typename bucket_plus_vtraits_t::bucket_type bucket_type;
1547
+ typedef typename bucket_plus_vtraits_t::slist_node_algorithms slist_node_algorithms;
1548
+ typedef typename unordered_bucket_ptr_impl
1549
+ <value_traits>::type bucket_ptr;
1550
+
1551
+ bucket_hash_equal_t(const ValueTraits &val_traits, const bucket_traits &b_traits, const hasher & h, const key_equal &e)
1552
+ : bucket_hash_type(val_traits, b_traits, h)
1144
1553
  , equal_holder_t(e)
1145
1554
  {}
1146
1555
 
1556
+ BOOST_INTRUSIVE_FORCEINLINE bucket_hash_equal_t(BOOST_RV_REF(bucket_hash_equal_t) other)
1557
+ : bucket_hash_type(BOOST_MOVE_BASE(bucket_hash_type, other))
1558
+ , equal_holder_t(BOOST_MOVE_BASE(equal_holder_t, other))
1559
+ {}
1560
+
1147
1561
  BOOST_INTRUSIVE_FORCEINLINE bucket_ptr priv_get_cache()
1148
- { return this->bucket_hash_type::priv_bucket_pointer(); }
1562
+ { return this->priv_bucket_pointer(); }
1149
1563
 
1150
- BOOST_INTRUSIVE_FORCEINLINE void priv_set_cache(const bucket_ptr &)
1564
+ BOOST_INTRUSIVE_FORCEINLINE void priv_set_cache(bucket_ptr)
1565
+ {}
1566
+
1567
+ BOOST_INTRUSIVE_FORCEINLINE void priv_set_cache_bucket_num(std::size_t)
1151
1568
  {}
1152
1569
 
1153
1570
  BOOST_INTRUSIVE_FORCEINLINE std::size_t priv_get_cache_bucket_num()
1154
1571
  { return 0u; }
1155
1572
 
1156
- BOOST_INTRUSIVE_FORCEINLINE void priv_initialize_cache()
1573
+ BOOST_INTRUSIVE_FORCEINLINE void priv_init_cache()
1157
1574
  {}
1158
1575
 
1159
1576
  BOOST_INTRUSIVE_FORCEINLINE void priv_swap_cache(bucket_hash_equal_t &)
1160
1577
  {}
1161
1578
 
1162
- siterator priv_begin() const
1579
+ siterator priv_begin(bucket_ptr &pbucketptr) const
1163
1580
  {
1164
1581
  std::size_t n = 0;
1165
- std::size_t bucket_cnt = this->bucket_hash_type::priv_bucket_count();
1582
+ std::size_t bucket_cnt = this->priv_usable_bucket_count();
1166
1583
  for (n = 0; n < bucket_cnt; ++n){
1167
- bucket_type &b = this->bucket_hash_type::priv_bucket_pointer()[n];
1168
- if(!b.empty()){
1169
- return b.begin();
1584
+ bucket_type &b = this->priv_bucket(n);
1585
+ if(!slist_node_algorithms::is_empty(b.get_node_ptr())){
1586
+ pbucketptr = this->to_ptr(b);
1587
+ return siterator(b.begin_ptr());
1170
1588
  }
1171
1589
  }
1172
- return this->bucket_hash_type::priv_invalid_local_it();
1590
+ pbucketptr = this->priv_invalid_bucket_ptr();
1591
+ return this->priv_end_sit();
1173
1592
  }
1174
1593
 
1175
1594
  BOOST_INTRUSIVE_FORCEINLINE void priv_insertion_update_cache(std::size_t)
@@ -1178,6 +1597,9 @@ struct bucket_hash_equal_t
1178
1597
  BOOST_INTRUSIVE_FORCEINLINE void priv_erasure_update_cache_range(std::size_t, std::size_t)
1179
1598
  {}
1180
1599
 
1600
+ BOOST_INTRUSIVE_FORCEINLINE void priv_erasure_update_cache(bucket_ptr)
1601
+ {}
1602
+
1181
1603
  BOOST_INTRUSIVE_FORCEINLINE void priv_erasure_update_cache()
1182
1604
  {}
1183
1605
 
@@ -1191,65 +1613,82 @@ struct bucket_hash_equal_t
1191
1613
  //bucket_hash_equal_t
1192
1614
  //Stores bucket_hash_t and the equality function when the first
1193
1615
  //non-empty bucket shall be cached.
1194
- template<class ValueTraits, class VoidOrKeyOfValue, class VoidOrKeyHash, class VoidOrKeyEqual, class BucketTraits> //cache_begin == true version
1195
- struct bucket_hash_equal_t<ValueTraits, VoidOrKeyOfValue, VoidOrKeyHash, VoidOrKeyEqual, BucketTraits, true>
1616
+ template<class ValueTraits, class VoidOrKeyOfValue, class VoidOrKeyHash, class VoidOrKeyEqual, class BucketTraits, bool LinearBuckets> //cache_begin == true version
1617
+ struct bucket_hash_equal_t<ValueTraits, VoidOrKeyOfValue, VoidOrKeyHash, VoidOrKeyEqual, BucketTraits, LinearBuckets, true>
1196
1618
  //Use public inheritance to avoid MSVC bugs with closures
1197
- : bucket_hash_t<ValueTraits, VoidOrKeyOfValue, VoidOrKeyHash, BucketTraits> //2
1198
- , hashtable_equal_holder<ValueTraits, BucketTraits, VoidOrKeyOfValue, VoidOrKeyEqual>::type
1619
+ : public bucket_hash_t<ValueTraits, VoidOrKeyOfValue, VoidOrKeyHash, BucketTraits, LinearBuckets> //2
1620
+ , public hashtable_equal_holder<ValueTraits, BucketTraits, VoidOrKeyOfValue, VoidOrKeyEqual, LinearBuckets>::type
1199
1621
  {
1622
+ private:
1623
+ BOOST_MOVABLE_BUT_NOT_COPYABLE(bucket_hash_equal_t)
1624
+
1625
+ public:
1626
+
1200
1627
  typedef typename hashtable_equal_holder
1201
- <ValueTraits, BucketTraits, VoidOrKeyOfValue, VoidOrKeyEqual>::type equal_holder_t;
1628
+ < ValueTraits, BucketTraits
1629
+ , VoidOrKeyOfValue, VoidOrKeyEqual, LinearBuckets>::type equal_holder_t;
1202
1630
 
1203
- typedef bucket_plus_vtraits<ValueTraits,BucketTraits> bucket_plus_vtraits_t;
1631
+ typedef bucket_plus_vtraits
1632
+ < ValueTraits, BucketTraits, LinearBuckets> bucket_plus_vtraits_t;
1204
1633
  typedef ValueTraits value_traits;
1205
1634
  typedef typename equal_holder_t::functor_type key_equal;
1206
- typedef bucket_hash_t<ValueTraits, VoidOrKeyOfValue, VoidOrKeyHash, BucketTraits> bucket_hash_type;
1635
+ typedef bucket_hash_t
1636
+ < ValueTraits, VoidOrKeyOfValue
1637
+ , VoidOrKeyHash, BucketTraits, LinearBuckets> bucket_hash_type;
1207
1638
  typedef typename bucket_hash_type::hasher hasher;
1208
1639
  typedef BucketTraits bucket_traits;
1209
- typedef typename bucket_plus_vtraits_t::slist_impl::iterator siterator;
1640
+ typedef typename bucket_plus_vtraits_t::siterator siterator;
1641
+ typedef typename bucket_plus_vtraits_t::slist_node_algorithms slist_node_algorithms;
1210
1642
 
1211
- template<class BucketTraitsType>
1212
- bucket_hash_equal_t(const ValueTraits &val_traits, BOOST_FWD_REF(BucketTraitsType) b_traits, const hasher & h, const key_equal &e)
1213
- : bucket_hash_type(val_traits, ::boost::forward<BucketTraitsType>(b_traits), h)
1643
+ bucket_hash_equal_t(const ValueTraits &val_traits, const bucket_traits &b_traits, const hasher & h, const key_equal &e)
1644
+ : bucket_hash_type(val_traits, b_traits, h)
1214
1645
  , equal_holder_t(e)
1215
1646
  {}
1216
1647
 
1217
- typedef typename detail::unordered_bucket_ptr_impl
1218
- <typename bucket_hash_type::value_traits>::type bucket_ptr;
1648
+ BOOST_INTRUSIVE_FORCEINLINE bucket_hash_equal_t(BOOST_RV_REF(bucket_hash_equal_t) other)
1649
+ : bucket_hash_type(BOOST_MOVE_BASE(bucket_hash_type, other))
1650
+ , equal_holder_t(BOOST_MOVE_BASE(equal_holder_t, other))
1651
+ {}
1219
1652
 
1220
- BOOST_INTRUSIVE_FORCEINLINE bucket_ptr &priv_get_cache()
1221
- { return cached_begin_; }
1653
+ typedef typename unordered_bucket_ptr_impl
1654
+ <typename bucket_hash_type::value_traits>::type bucket_ptr;
1222
1655
 
1223
- BOOST_INTRUSIVE_FORCEINLINE const bucket_ptr &priv_get_cache() const
1656
+ BOOST_INTRUSIVE_FORCEINLINE bucket_ptr priv_get_cache() const
1224
1657
  { return cached_begin_; }
1225
1658
 
1226
- BOOST_INTRUSIVE_FORCEINLINE void priv_set_cache(const bucket_ptr &p)
1659
+ BOOST_INTRUSIVE_FORCEINLINE void priv_set_cache(bucket_ptr p)
1227
1660
  { cached_begin_ = p; }
1228
1661
 
1662
+ BOOST_INTRUSIVE_FORCEINLINE void priv_set_cache_bucket_num(std::size_t insertion_bucket)
1663
+ {
1664
+ BOOST_INTRUSIVE_INVARIANT_ASSERT(insertion_bucket <= this->priv_usable_bucket_count());
1665
+ this->cached_begin_ = this->priv_bucket_pointer() + std::ptrdiff_t(insertion_bucket);
1666
+ }
1667
+
1229
1668
  BOOST_INTRUSIVE_FORCEINLINE std::size_t priv_get_cache_bucket_num()
1230
- { return this->cached_begin_ - this->bucket_hash_type::priv_bucket_pointer(); }
1669
+ { return std::size_t(this->cached_begin_ - this->priv_bucket_pointer()); }
1231
1670
 
1232
- BOOST_INTRUSIVE_FORCEINLINE void priv_initialize_cache()
1233
- { this->cached_begin_ = this->bucket_hash_type::priv_invalid_bucket(); }
1671
+ BOOST_INTRUSIVE_FORCEINLINE void priv_init_cache()
1672
+ { this->cached_begin_ = this->priv_past_usable_bucket_ptr(); }
1234
1673
 
1235
- BOOST_INTRUSIVE_FORCEINLINE void priv_swap_cache(bucket_hash_equal_t &other)
1236
- {
1237
- ::boost::adl_move_swap(this->cached_begin_, other.cached_begin_);
1238
- }
1674
+ BOOST_INTRUSIVE_FORCEINLINE void priv_swap_cache(bucket_hash_equal_t &other)
1675
+ { ::boost::adl_move_swap(this->cached_begin_, other.cached_begin_); }
1239
1676
 
1240
- siterator priv_begin() const
1677
+ siterator priv_begin(bucket_ptr& pbucketptr) const
1241
1678
  {
1242
- if(this->cached_begin_ == this->bucket_hash_type::priv_invalid_bucket()){
1243
- return this->bucket_hash_type::priv_invalid_local_it();
1679
+ pbucketptr = this->cached_begin_;
1680
+ if(this->cached_begin_ == this->priv_past_usable_bucket_ptr()){
1681
+ return this->priv_end_sit();
1244
1682
  }
1245
1683
  else{
1246
- return this->cached_begin_->begin();
1684
+ return siterator(cached_begin_->begin_ptr());
1247
1685
  }
1248
1686
  }
1249
1687
 
1250
1688
  void priv_insertion_update_cache(std::size_t insertion_bucket)
1251
1689
  {
1252
- bucket_ptr p = this->bucket_hash_type::priv_bucket_pointer() + insertion_bucket;
1690
+ BOOST_INTRUSIVE_INVARIANT_ASSERT(insertion_bucket < this->priv_usable_bucket_count());
1691
+ bucket_ptr p = this->priv_bucket_pointer() + std::ptrdiff_t(insertion_bucket);
1253
1692
  if(p < this->cached_begin_){
1254
1693
  this->cached_begin_ = p;
1255
1694
  }
@@ -1266,24 +1705,30 @@ struct bucket_hash_equal_t<ValueTraits, VoidOrKeyOfValue, VoidOrKeyHash, VoidOrK
1266
1705
  //If the last bucket is the end, the cache must be updated
1267
1706
  //to the last position if all
1268
1707
  if(this->priv_get_cache_bucket_num() == first_bucket_num &&
1269
- this->bucket_hash_type::priv_bucket_pointer()[first_bucket_num].empty() ){
1270
- this->priv_set_cache(this->bucket_hash_type::priv_bucket_pointer() + last_bucket_num);
1708
+ this->priv_bucket_empty(first_bucket_num) ){
1709
+ this->priv_set_cache(this->priv_bucket_pointer() + std::ptrdiff_t(last_bucket_num));
1710
+ this->priv_erasure_update_cache();
1711
+ }
1712
+ }
1713
+
1714
+ void priv_erasure_update_cache(bucket_ptr first_bucket)
1715
+ {
1716
+ //If the last bucket is the end, the cache must be updated
1717
+ //to the last position if all
1718
+ if (this->priv_get_cache() == first_bucket &&
1719
+ this->priv_bucket_empty(first_bucket)) {
1271
1720
  this->priv_erasure_update_cache();
1272
1721
  }
1273
1722
  }
1274
1723
 
1275
1724
  void priv_erasure_update_cache()
1276
1725
  {
1277
- if(this->cached_begin_ != this->bucket_hash_type::priv_invalid_bucket()){
1278
- std::size_t current_n = this->priv_get_cache() - this->bucket_hash_type::priv_bucket_pointer();
1279
- for( const std::size_t num_buckets = this->bucket_hash_type::priv_bucket_count()
1280
- ; current_n < num_buckets
1281
- ; ++current_n, ++this->priv_get_cache()){
1282
- if(!this->priv_get_cache()->empty()){
1283
- return;
1284
- }
1726
+ const bucket_ptr cache_end = this->priv_past_usable_bucket_ptr();
1727
+ while( cached_begin_ != cache_end) {
1728
+ if (!slist_node_algorithms::is_empty(cached_begin_->get_node_ptr())) {
1729
+ return;
1285
1730
  }
1286
- this->priv_initialize_cache();
1731
+ ++cached_begin_;
1287
1732
  }
1288
1733
  }
1289
1734
 
@@ -1294,42 +1739,67 @@ struct bucket_hash_equal_t<ValueTraits, VoidOrKeyOfValue, VoidOrKeyHash, VoidOrK
1294
1739
  //to maintain minimal container size with compilers like MSVC
1295
1740
  //that have problems with EBO and multiple empty base classes
1296
1741
  template<class DeriveFrom, class SizeType, bool>
1297
- struct hashtable_size_traits_wrapper
1742
+ struct hashtable_size_wrapper
1298
1743
  : public DeriveFrom
1299
1744
  {
1745
+ private:
1746
+ BOOST_MOVABLE_BUT_NOT_COPYABLE(hashtable_size_wrapper)
1747
+
1748
+ public:
1300
1749
  template<class Base, class Arg0, class Arg1, class Arg2>
1301
- hashtable_size_traits_wrapper( BOOST_FWD_REF(Base) base, BOOST_FWD_REF(Arg0) arg0
1302
- , BOOST_FWD_REF(Arg1) arg1, BOOST_FWD_REF(Arg2) arg2)
1303
- : DeriveFrom(::boost::forward<Base>(base)
1304
- , ::boost::forward<Arg0>(arg0)
1305
- , ::boost::forward<Arg1>(arg1)
1306
- , ::boost::forward<Arg2>(arg2))
1750
+ hashtable_size_wrapper( BOOST_FWD_REF(Base) base, BOOST_FWD_REF(Arg0) arg0
1751
+ , BOOST_FWD_REF(Arg1) arg1, BOOST_FWD_REF(Arg2) arg2)
1752
+ : DeriveFrom( ::boost::forward<Base>(base)
1753
+ , ::boost::forward<Arg0>(arg0)
1754
+ , ::boost::forward<Arg1>(arg1)
1755
+ , ::boost::forward<Arg2>(arg2))
1307
1756
  {}
1308
1757
  typedef detail::size_holder < true, SizeType> size_traits;//size_traits
1309
1758
 
1759
+ BOOST_INTRUSIVE_FORCEINLINE hashtable_size_wrapper(BOOST_RV_REF(hashtable_size_wrapper) other)
1760
+ : DeriveFrom(BOOST_MOVE_BASE(DeriveFrom, other))
1761
+ {}
1762
+
1310
1763
  size_traits size_traits_;
1311
1764
 
1312
1765
  typedef const size_traits & size_traits_const_t;
1313
1766
  typedef size_traits & size_traits_t;
1314
1767
 
1315
- BOOST_INTRUSIVE_FORCEINLINE size_traits_const_t priv_size_traits() const
1316
- { return size_traits_; }
1768
+ BOOST_INTRUSIVE_FORCEINLINE SizeType get_hashtable_size_wrapper_size() const
1769
+ { return size_traits_.get_size(); }
1770
+
1771
+ BOOST_INTRUSIVE_FORCEINLINE void set_hashtable_size_wrapper_size(SizeType s)
1772
+ { size_traits_.set_size(s); }
1773
+
1774
+ BOOST_INTRUSIVE_FORCEINLINE void inc_hashtable_size_wrapper_size()
1775
+ { size_traits_.increment(); }
1776
+
1777
+ BOOST_INTRUSIVE_FORCEINLINE void dec_hashtable_size_wrapper_size()
1778
+ { size_traits_.decrement(); }
1317
1779
 
1318
1780
  BOOST_INTRUSIVE_FORCEINLINE size_traits_t priv_size_traits()
1319
1781
  { return size_traits_; }
1320
1782
  };
1321
1783
 
1322
1784
  template<class DeriveFrom, class SizeType>
1323
- struct hashtable_size_traits_wrapper<DeriveFrom, SizeType, false>
1785
+ struct hashtable_size_wrapper<DeriveFrom, SizeType, false>
1324
1786
  : public DeriveFrom
1325
1787
  {
1788
+ private:
1789
+ BOOST_MOVABLE_BUT_NOT_COPYABLE(hashtable_size_wrapper)
1790
+
1791
+ public:
1326
1792
  template<class Base, class Arg0, class Arg1, class Arg2>
1327
- hashtable_size_traits_wrapper( BOOST_FWD_REF(Base) base, BOOST_FWD_REF(Arg0) arg0
1328
- , BOOST_FWD_REF(Arg1) arg1, BOOST_FWD_REF(Arg2) arg2)
1329
- : DeriveFrom(::boost::forward<Base>(base)
1330
- , ::boost::forward<Arg0>(arg0)
1331
- , ::boost::forward<Arg1>(arg1)
1332
- , ::boost::forward<Arg2>(arg2))
1793
+ hashtable_size_wrapper( BOOST_FWD_REF(Base) base, BOOST_FWD_REF(Arg0) arg0
1794
+ , BOOST_FWD_REF(Arg1) arg1, BOOST_FWD_REF(Arg2) arg2)
1795
+ : DeriveFrom( ::boost::forward<Base>(base)
1796
+ , ::boost::forward<Arg0>(arg0)
1797
+ , ::boost::forward<Arg1>(arg1)
1798
+ , ::boost::forward<Arg2>(arg2))
1799
+ {}
1800
+
1801
+ BOOST_INTRUSIVE_FORCEINLINE hashtable_size_wrapper(BOOST_RV_REF(hashtable_size_wrapper) other)
1802
+ : DeriveFrom(BOOST_MOVE_BASE(DeriveFrom, other))
1333
1803
  {}
1334
1804
 
1335
1805
  typedef detail::size_holder< false, SizeType> size_traits;
@@ -1337,38 +1807,61 @@ struct hashtable_size_traits_wrapper<DeriveFrom, SizeType, false>
1337
1807
  typedef size_traits size_traits_const_t;
1338
1808
  typedef size_traits size_traits_t;
1339
1809
 
1340
- BOOST_INTRUSIVE_FORCEINLINE size_traits priv_size_traits() const
1810
+ BOOST_INTRUSIVE_FORCEINLINE SizeType get_hashtable_size_wrapper_size() const
1811
+ { return 0u; }
1812
+
1813
+ BOOST_INTRUSIVE_FORCEINLINE void set_hashtable_size_wrapper_size(SizeType)
1814
+ {}
1815
+
1816
+ BOOST_INTRUSIVE_FORCEINLINE void inc_hashtable_size_wrapper_size()
1817
+ {}
1818
+
1819
+ BOOST_INTRUSIVE_FORCEINLINE void dec_hashtable_size_wrapper_size()
1820
+ {}
1821
+
1822
+ BOOST_INTRUSIVE_FORCEINLINE size_traits priv_size_traits()
1341
1823
  { return size_traits(); }
1342
1824
  };
1343
1825
 
1344
- //hashdata_internal
1345
- //Stores bucket_hash_equal_t and split_traits
1346
- template<class ValueTraits, class VoidOrKeyOfValue, class VoidOrKeyHash, class VoidOrKeyEqual, class BucketTraits, class SizeType, std::size_t BoolFlags>
1347
- struct hashdata_internal
1348
- : public hashtable_size_traits_wrapper
1349
- < bucket_hash_equal_t
1350
- < ValueTraits, VoidOrKeyOfValue, VoidOrKeyHash, VoidOrKeyEqual
1351
- , BucketTraits
1352
- , 0 != (BoolFlags & hash_bool_flags::cache_begin_pos)
1353
- > //2
1354
- , SizeType
1355
- , (BoolFlags & hash_bool_flags::incremental_pos) != 0
1356
- >
1826
+ template< class ValueTraits, class VoidOrKeyOfValue, class VoidOrKeyHash
1827
+ , class VoidOrKeyEqual, class BucketTraits, class SizeType
1828
+ , std::size_t BoolFlags>
1829
+ struct get_hashtable_size_wrapper_bucket
1357
1830
  {
1358
- typedef hashtable_size_traits_wrapper
1831
+ typedef hashtable_size_wrapper
1359
1832
  < bucket_hash_equal_t
1360
1833
  < ValueTraits, VoidOrKeyOfValue, VoidOrKeyHash, VoidOrKeyEqual
1361
1834
  , BucketTraits
1835
+ , 0 != (BoolFlags & hash_bool_flags::linear_buckets_pos)
1362
1836
  , 0 != (BoolFlags & hash_bool_flags::cache_begin_pos)
1363
1837
  > //2
1364
1838
  , SizeType
1365
- , (BoolFlags & hash_bool_flags::incremental_pos) != 0
1366
- > internal_type;
1367
- typedef typename internal_type::key_equal key_equal;
1368
- typedef typename internal_type::hasher hasher;
1369
- typedef bucket_plus_vtraits<ValueTraits,BucketTraits> bucket_plus_vtraits_t;
1839
+ , (BoolFlags & hash_bool_flags::incremental_pos) != 0 ||
1840
+ (BoolFlags & hash_bool_flags::fastmod_buckets_pos) != 0
1841
+ > type;
1842
+ };
1843
+
1844
+ //hashdata_internal
1845
+ //Stores bucket_hash_equal_t and split_traits
1846
+ template<class ValueTraits, class VoidOrKeyOfValue, class VoidOrKeyHash, class VoidOrKeyEqual, class BucketTraits, class SizeType, std::size_t BoolFlags>
1847
+ struct hashdata_internal
1848
+ : public get_hashtable_size_wrapper_bucket
1849
+ <ValueTraits, VoidOrKeyOfValue, VoidOrKeyHash, VoidOrKeyEqual, BucketTraits, SizeType, BoolFlags>::type
1850
+ {
1851
+ private:
1852
+ BOOST_MOVABLE_BUT_NOT_COPYABLE(hashdata_internal)
1853
+
1854
+ public:
1855
+ static const bool linear_buckets = 0 != (BoolFlags & hash_bool_flags::linear_buckets_pos);
1856
+ typedef typename get_hashtable_size_wrapper_bucket
1857
+ <ValueTraits, VoidOrKeyOfValue, VoidOrKeyHash, VoidOrKeyEqual, BucketTraits, SizeType, BoolFlags>::type split_bucket_hash_equal_t;
1858
+
1859
+ typedef typename split_bucket_hash_equal_t::key_equal key_equal;
1860
+ typedef typename split_bucket_hash_equal_t::hasher hasher;
1861
+ typedef bucket_plus_vtraits
1862
+ <ValueTraits, BucketTraits, linear_buckets> bucket_plus_vtraits_t;
1370
1863
  typedef SizeType size_type;
1371
- typedef typename internal_type::size_traits split_traits;
1864
+ typedef typename split_bucket_hash_equal_t::size_traits split_traits;
1372
1865
  typedef typename bucket_plus_vtraits_t::bucket_ptr bucket_ptr;
1373
1866
  typedef typename bucket_plus_vtraits_t::const_value_traits_ptr const_value_traits_ptr;
1374
1867
  typedef typename bucket_plus_vtraits_t::siterator siterator;
@@ -1383,15 +1876,10 @@ struct hashdata_internal
1383
1876
  <const_pointer>::reference const_reference;
1384
1877
  typedef typename value_traits::node_traits node_traits;
1385
1878
  typedef typename node_traits::node node;
1386
- typedef typename node_traits::node_ptr node_ptr;
1387
- typedef typename node_traits::const_node_ptr const_node_ptr;
1388
- typedef detail::node_functions<node_traits> node_functions_t;
1389
- typedef typename get_slist_impl
1390
- <typename reduced_slist_node_traits
1391
- <typename value_traits::node_traits>::type
1392
- >::type slist_impl;
1393
- typedef typename slist_impl::node_algorithms node_algorithms;
1394
- typedef typename slist_impl::node_ptr slist_node_ptr;
1879
+ typedef typename node_traits::node_ptr node_ptr;
1880
+ typedef typename node_traits::const_node_ptr const_node_ptr;
1881
+ typedef typename bucket_plus_vtraits_t::slist_node_algorithms slist_node_algorithms;
1882
+ typedef typename bucket_plus_vtraits_t::slist_node_ptr slist_node_ptr;
1395
1883
 
1396
1884
  typedef hash_key_types_base
1397
1885
  < typename ValueTraits::value_type
@@ -1399,187 +1887,278 @@ struct hashdata_internal
1399
1887
  > hash_types_base;
1400
1888
  typedef typename hash_types_base::key_of_value key_of_value;
1401
1889
 
1402
- static const bool store_hash = detail::store_hash_is_true<node_traits>::value;
1890
+ static const bool store_hash = store_hash_is_true<node_traits>::value;
1403
1891
  static const bool safemode_or_autounlink = is_safe_autounlink<value_traits::link_mode>::value;
1404
1892
  static const bool stateful_value_traits = detail::is_stateful_value_traits<value_traits>::value;
1405
1893
 
1406
1894
  typedef detail::bool_<store_hash> store_hash_t;
1407
1895
 
1408
1896
  typedef detail::transform_iterator
1409
- < typename slist_impl::iterator
1410
- , downcast_node_to_value_t
1411
- < value_traits
1412
- , false> > local_iterator;
1897
+ < siterator
1898
+ , downcast_node_to_value_t<value_traits, false> > local_iterator;
1413
1899
 
1414
1900
  typedef detail::transform_iterator
1415
- < typename slist_impl::iterator
1416
- , downcast_node_to_value_t
1417
- < value_traits
1418
- , true> > const_local_iterator;
1419
- //
1901
+ < siterator
1902
+ , downcast_node_to_value_t<value_traits, true> > const_local_iterator;
1420
1903
 
1421
- template<class BucketTraitsType>
1422
- hashdata_internal( const ValueTraits &val_traits, BOOST_FWD_REF(BucketTraitsType) b_traits
1904
+ typedef detail::bool_<linear_buckets> linear_buckets_t;
1905
+
1906
+ hashdata_internal( const ValueTraits &val_traits, const bucket_traits &b_traits
1423
1907
  , const hasher & h, const key_equal &e)
1424
- : internal_type(val_traits, ::boost::forward<BucketTraitsType>(b_traits), h, e)
1908
+ : split_bucket_hash_equal_t(val_traits, b_traits, h, e)
1425
1909
  {}
1426
1910
 
1427
- BOOST_INTRUSIVE_FORCEINLINE typename internal_type::size_traits_t priv_split_traits()
1428
- { return this->priv_size_traits(); }
1911
+ BOOST_INTRUSIVE_FORCEINLINE hashdata_internal(BOOST_RV_REF(hashdata_internal) other)
1912
+ : split_bucket_hash_equal_t(BOOST_MOVE_BASE(split_bucket_hash_equal_t, other))
1913
+ {}
1429
1914
 
1430
- BOOST_INTRUSIVE_FORCEINLINE typename internal_type::size_traits_const_t priv_split_traits() const
1915
+ BOOST_INTRUSIVE_FORCEINLINE typename split_bucket_hash_equal_t::size_traits_t priv_split_traits()
1431
1916
  { return this->priv_size_traits(); }
1432
1917
 
1433
1918
  ~hashdata_internal()
1434
1919
  { this->priv_clear_buckets(); }
1435
1920
 
1921
+ using split_bucket_hash_equal_t::priv_clear_buckets;
1922
+
1436
1923
  void priv_clear_buckets()
1437
1924
  {
1438
- this->internal_type::priv_clear_buckets
1439
- ( this->priv_get_cache()
1440
- , this->internal_type::priv_bucket_count()
1441
- - (this->priv_get_cache()
1442
- - this->internal_type::priv_bucket_pointer()));
1925
+ const std::size_t cache_num = this->priv_get_cache_bucket_num();
1926
+ this->priv_clear_buckets(this->priv_get_cache(), this->priv_usable_bucket_count() - cache_num);
1443
1927
  }
1444
1928
 
1445
1929
  void priv_clear_buckets_and_cache()
1446
1930
  {
1447
1931
  this->priv_clear_buckets();
1448
- this->priv_initialize_cache();
1932
+ this->priv_init_cache();
1449
1933
  }
1450
1934
 
1451
- void priv_initialize_buckets_and_cache()
1935
+ void priv_init_buckets_and_cache()
1452
1936
  {
1453
- this->internal_type::priv_clear_buckets
1454
- ( this->internal_type::priv_bucket_pointer()
1455
- , this->internal_type::priv_bucket_count());
1456
- this->priv_initialize_cache();
1937
+ this->priv_init_buckets(this->priv_bucket_pointer(), this->priv_usable_bucket_count());
1938
+ this->priv_init_cache();
1457
1939
  }
1940
+
1941
+ typedef typename bucket_plus_vtraits_t::iterator iterator;
1942
+ typedef typename bucket_plus_vtraits_t::const_iterator const_iterator;
1458
1943
 
1459
- typedef hashtable_iterator<bucket_plus_vtraits_t, false> iterator;
1460
- typedef hashtable_iterator<bucket_plus_vtraits_t, true> const_iterator;
1461
-
1462
- static std::size_t priv_stored_hash(slist_node_ptr n, detail::true_ true_value)
1463
- { return bucket_plus_vtraits<ValueTraits, BucketTraits>::priv_stored_hash(n, true_value); }
1944
+ //public functions
1945
+ BOOST_INTRUSIVE_FORCEINLINE SizeType split_count() const BOOST_NOEXCEPT
1946
+ { return this->split_bucket_hash_equal_t::get_hashtable_size_wrapper_size(); }
1464
1947
 
1465
- static std::size_t priv_stored_hash(slist_node_ptr n, detail::false_ false_value)
1466
- { return bucket_plus_vtraits<ValueTraits, BucketTraits>::priv_stored_hash(n, false_value); }
1948
+ BOOST_INTRUSIVE_FORCEINLINE void split_count(SizeType s) BOOST_NOEXCEPT
1949
+ { this->split_bucket_hash_equal_t::set_hashtable_size_wrapper_size(s); }
1467
1950
 
1468
1951
  //public functions
1469
- BOOST_INTRUSIVE_FORCEINLINE SizeType split_count() const
1952
+ BOOST_INTRUSIVE_FORCEINLINE void inc_split_count() BOOST_NOEXCEPT
1953
+ { this->split_bucket_hash_equal_t::inc_hashtable_size_wrapper_size(); }
1954
+
1955
+ BOOST_INTRUSIVE_FORCEINLINE void dec_split_count() BOOST_NOEXCEPT
1956
+ { this->split_bucket_hash_equal_t::dec_hashtable_size_wrapper_size(); }
1957
+
1958
+ BOOST_INTRUSIVE_FORCEINLINE static SizeType initial_split_from_bucket_count(SizeType bc) BOOST_NOEXCEPT
1959
+ {
1960
+ BOOST_IF_CONSTEXPR(fastmod_buckets) {
1961
+ size_type split;
1962
+ split = static_cast<SizeType>(prime_fmod_size::lower_size_index(bc));
1963
+ //The passed bucket size must be exactly the supported one
1964
+ BOOST_ASSERT(prime_fmod_size::size(split) == bc);
1965
+ return split;
1966
+ }
1967
+ else {
1968
+ BOOST_IF_CONSTEXPR(incremental) {
1969
+ BOOST_ASSERT(0 == (std::size_t(bc) & (std::size_t(bc) - 1u)));
1970
+ return size_type(bc >> 1u);
1971
+ }
1972
+ else{
1973
+ return bc;
1974
+ }
1975
+ }
1976
+ }
1977
+
1978
+ BOOST_INTRUSIVE_FORCEINLINE static SizeType rehash_split_from_bucket_count(SizeType bc) BOOST_NOEXCEPT
1470
1979
  {
1471
- return this->priv_split_traits().get_size();
1980
+ BOOST_IF_CONSTEXPR(fastmod_buckets) {
1981
+ return (initial_split_from_bucket_count)(bc);
1982
+ }
1983
+ else {
1984
+ BOOST_IF_CONSTEXPR(incremental) {
1985
+ BOOST_ASSERT(0 == (std::size_t(bc) & (std::size_t(bc) - 1u)));
1986
+ return bc;
1987
+ }
1988
+ else{
1989
+ return bc;
1990
+ }
1991
+ }
1472
1992
  }
1473
1993
 
1474
- BOOST_INTRUSIVE_FORCEINLINE iterator iterator_to(reference value)
1994
+ BOOST_INTRUSIVE_FORCEINLINE iterator iterator_to(reference value) BOOST_NOEXCEPT_IF(!linear_buckets)
1995
+ { return iterator_to(value, linear_buckets_t()); }
1996
+
1997
+ const_iterator iterator_to(const_reference value) const BOOST_NOEXCEPT_IF(!linear_buckets)
1998
+ { return iterator_to(value, linear_buckets_t()); }
1999
+
2000
+ iterator iterator_to(reference value, detail::true_) //linear_buckets
1475
2001
  {
1476
- return iterator(bucket_type::s_iterator_to
1477
- (this->priv_value_to_node(value)), &this->get_bucket_value_traits());
2002
+ const std::size_t h = this->priv_stored_or_compute_hash(value, store_hash_t());
2003
+ siterator sit(this->priv_value_to_node_ptr(value));
2004
+ return this->build_iterator(sit, this->priv_hash_to_bucket_ptr(h));
1478
2005
  }
1479
2006
 
1480
- const_iterator iterator_to(const_reference value) const
2007
+ const_iterator iterator_to(const_reference value, detail::true_) const //linear_buckets
1481
2008
  {
1482
- siterator const sit = bucket_type::s_iterator_to
1483
- ( *pointer_traits<node_ptr>::const_cast_from
1484
- (pointer_traits<const_node_ptr>::pointer_to(this->priv_value_to_node(value)))
2009
+ const std::size_t h = this->priv_stored_or_compute_hash(value, store_hash_t());
2010
+ siterator const sit = siterator
2011
+ ( pointer_traits<node_ptr>::const_cast_from(this->priv_value_to_node_ptr(value))
1485
2012
  );
2013
+ return this->build_const_iterator(sit, this->priv_hash_to_bucket_ptr(h));
2014
+ }
2015
+
2016
+ static const bool incremental = 0 != (BoolFlags & hash_bool_flags::incremental_pos);
2017
+ static const bool power_2_buckets = incremental || (0 != (BoolFlags & hash_bool_flags::power_2_buckets_pos));
2018
+ static const bool fastmod_buckets = 0 != (BoolFlags & hash_bool_flags::fastmod_buckets_pos);
2019
+
2020
+ typedef detail::bool_<fastmod_buckets> fastmod_buckets_t;
2021
+
2022
+ BOOST_INTRUSIVE_FORCEINLINE bucket_type &priv_hash_to_bucket(std::size_t hash_value) const
2023
+ { return this->priv_bucket(this->priv_hash_to_nbucket(hash_value)); }
2024
+
2025
+ BOOST_INTRUSIVE_FORCEINLINE bucket_ptr priv_hash_to_bucket_ptr(std::size_t hash_value) const
2026
+ { return this->priv_bucket_ptr(this->priv_hash_to_nbucket(hash_value)); }
2027
+
2028
+ BOOST_INTRUSIVE_FORCEINLINE size_type priv_hash_to_nbucket(std::size_t hash_value) const
2029
+ { return (priv_hash_to_nbucket)(hash_value, fastmod_buckets_t()); }
2030
+
2031
+ BOOST_INTRUSIVE_FORCEINLINE size_type priv_hash_to_nbucket(std::size_t hash_value, detail::true_) const //fastmod_buckets_t
2032
+ { return static_cast<size_type>(prime_fmod_size::position(hash_value, this->split_count())); }
2033
+
2034
+ BOOST_INTRUSIVE_FORCEINLINE size_type priv_hash_to_nbucket(std::size_t hash_value, detail::false_) const //!fastmod_buckets_t
2035
+ {
2036
+ return static_cast<size_type>(hash_to_bucket_split<power_2_buckets, incremental>
2037
+ (hash_value, this->priv_usable_bucket_count(), this->split_count(), detail::false_()));
2038
+ }
2039
+
2040
+ BOOST_INTRUSIVE_FORCEINLINE iterator iterator_to(reference value, detail::false_) BOOST_NOEXCEPT
2041
+ {
2042
+ return iterator( siterator(this->priv_value_to_node_ptr(value))
2043
+ , &this->get_bucket_value_traits());
2044
+ }
2045
+
2046
+ const_iterator iterator_to(const_reference value, detail::false_) const BOOST_NOEXCEPT
2047
+ {
2048
+ siterator const sit = siterator
2049
+ ( pointer_traits<node_ptr>::const_cast_from(this->priv_value_to_node_ptr(value)) );
1486
2050
  return const_iterator(sit, &this->get_bucket_value_traits());
1487
2051
  }
1488
2052
 
1489
- static local_iterator s_local_iterator_to(reference value)
2053
+
2054
+ static local_iterator s_local_iterator_to(reference value) BOOST_NOEXCEPT
1490
2055
  {
1491
2056
  BOOST_STATIC_ASSERT((!stateful_value_traits));
1492
- siterator sit = bucket_type::s_iterator_to(*value_traits::to_node_ptr(value));
2057
+ siterator sit(value_traits::to_node_ptr(value));
1493
2058
  return local_iterator(sit, const_value_traits_ptr());
1494
2059
  }
1495
2060
 
1496
- static const_local_iterator s_local_iterator_to(const_reference value)
2061
+ static const_local_iterator s_local_iterator_to(const_reference value) BOOST_NOEXCEPT
1497
2062
  {
1498
2063
  BOOST_STATIC_ASSERT((!stateful_value_traits));
1499
- siterator const sit = bucket_type::s_iterator_to
1500
- ( *pointer_traits<node_ptr>::const_cast_from
2064
+ siterator const sit = siterator
2065
+ ( pointer_traits<node_ptr>::const_cast_from
1501
2066
  (value_traits::to_node_ptr(value))
1502
2067
  );
1503
2068
  return const_local_iterator(sit, const_value_traits_ptr());
1504
2069
  }
1505
2070
 
1506
- local_iterator local_iterator_to(reference value)
2071
+ local_iterator local_iterator_to(reference value) BOOST_NOEXCEPT
1507
2072
  {
1508
- siterator sit = bucket_type::s_iterator_to(this->priv_value_to_node(value));
2073
+ siterator sit(this->priv_value_to_node_ptr(value));
1509
2074
  return local_iterator(sit, this->priv_value_traits_ptr());
1510
2075
  }
1511
2076
 
1512
- const_local_iterator local_iterator_to(const_reference value) const
2077
+ const_local_iterator local_iterator_to(const_reference value) const BOOST_NOEXCEPT
1513
2078
  {
1514
- siterator sit = bucket_type::s_iterator_to
1515
- ( *pointer_traits<node_ptr>::const_cast_from
1516
- (pointer_traits<const_node_ptr>::pointer_to(this->priv_value_to_node(value)))
1517
- );
2079
+ siterator sit
2080
+ ( pointer_traits<node_ptr>::const_cast_from(this->priv_value_to_node_ptr(value)) );
1518
2081
  return const_local_iterator(sit, this->priv_value_traits_ptr());
1519
2082
  }
1520
2083
 
1521
- BOOST_INTRUSIVE_FORCEINLINE size_type bucket_count() const
1522
- {
1523
- const std::size_t bc = this->priv_bucket_count();
1524
- BOOST_INTRUSIVE_INVARIANT_ASSERT(sizeof(size_type) >= sizeof(std::size_t) || bc <= size_type(-1));
1525
- return static_cast<size_type>(bc);
1526
- }
2084
+ BOOST_INTRUSIVE_FORCEINLINE size_type bucket_count() const BOOST_NOEXCEPT
2085
+ { return size_type(this->priv_usable_bucket_count()); }
1527
2086
 
1528
- BOOST_INTRUSIVE_FORCEINLINE size_type bucket_size(size_type n) const
1529
- { return this->priv_bucket_pointer()[n].size(); }
2087
+ BOOST_INTRUSIVE_FORCEINLINE size_type bucket_size(size_type n) const BOOST_NOEXCEPT
2088
+ { return (size_type)this->priv_bucket_size(n); }
1530
2089
 
1531
- BOOST_INTRUSIVE_FORCEINLINE bucket_ptr bucket_pointer() const
2090
+ BOOST_INTRUSIVE_FORCEINLINE bucket_ptr bucket_pointer() const BOOST_NOEXCEPT
1532
2091
  { return this->priv_bucket_pointer(); }
1533
2092
 
1534
- BOOST_INTRUSIVE_FORCEINLINE local_iterator begin(size_type n)
1535
- { return local_iterator(this->priv_bucket_pointer()[n].begin(), this->priv_value_traits_ptr()); }
2093
+ BOOST_INTRUSIVE_FORCEINLINE local_iterator begin(size_type n) BOOST_NOEXCEPT
2094
+ { return local_iterator(this->priv_bucket_lbegin(n), this->priv_value_traits_ptr()); }
1536
2095
 
1537
- BOOST_INTRUSIVE_FORCEINLINE const_local_iterator begin(size_type n) const
2096
+ BOOST_INTRUSIVE_FORCEINLINE const_local_iterator begin(size_type n) const BOOST_NOEXCEPT
1538
2097
  { return this->cbegin(n); }
1539
2098
 
1540
- static BOOST_INTRUSIVE_FORCEINLINE size_type suggested_upper_bucket_count(size_type n)
2099
+ static BOOST_INTRUSIVE_FORCEINLINE size_type suggested_upper_bucket_count(size_type n) BOOST_NOEXCEPT
1541
2100
  {
1542
- return prime_list_holder<0>::suggested_upper_bucket_count(n);
2101
+ BOOST_IF_CONSTEXPR(fastmod_buckets){
2102
+ std::size_t s = prime_fmod_size::upper_size_index(n);
2103
+ return static_cast<SizeType>(prime_fmod_size::size(s));
2104
+ }
2105
+ else{
2106
+ return prime_list_holder<0>::suggested_upper_bucket_count(n);
2107
+ }
1543
2108
  }
1544
2109
 
1545
- static BOOST_INTRUSIVE_FORCEINLINE size_type suggested_lower_bucket_count(size_type n)
2110
+ static BOOST_INTRUSIVE_FORCEINLINE size_type suggested_lower_bucket_count(size_type n) BOOST_NOEXCEPT
1546
2111
  {
1547
- return prime_list_holder<0>::suggested_lower_bucket_count(n);
2112
+ BOOST_IF_CONSTEXPR(fastmod_buckets){
2113
+ std::size_t s = prime_fmod_size::lower_size_index(n);
2114
+ return static_cast<SizeType>(prime_fmod_size::size(s));
2115
+ }
2116
+ else{
2117
+ return prime_list_holder<0>::suggested_lower_bucket_count(n);
2118
+ }
1548
2119
  }
1549
2120
 
1550
- const_local_iterator cbegin(size_type n) const
2121
+ const_local_iterator cbegin(size_type n) const BOOST_NOEXCEPT
1551
2122
  {
1552
2123
  return const_local_iterator
1553
- ( pointer_traits<bucket_ptr>::const_cast_from(this->priv_bucket_pointer())[n].begin()
2124
+ (this->priv_bucket_lbegin(n)
1554
2125
  , this->priv_value_traits_ptr());
1555
2126
  }
1556
2127
 
1557
- using internal_type::end;
1558
- using internal_type::cend;
2128
+ using split_bucket_hash_equal_t::end;
2129
+ using split_bucket_hash_equal_t::cend;
1559
2130
 
1560
- local_iterator end(size_type n)
1561
- { return local_iterator(this->priv_bucket_pointer()[n].end(), this->priv_value_traits_ptr()); }
2131
+ local_iterator end(size_type n) BOOST_NOEXCEPT
2132
+ { return local_iterator(this->priv_bucket_lend(n), this->priv_value_traits_ptr()); }
1562
2133
 
1563
- BOOST_INTRUSIVE_FORCEINLINE const_local_iterator end(size_type n) const
2134
+ BOOST_INTRUSIVE_FORCEINLINE const_local_iterator end(size_type n) const BOOST_NOEXCEPT
1564
2135
  { return this->cend(n); }
1565
2136
 
1566
- const_local_iterator cend(size_type n) const
2137
+ const_local_iterator cend(size_type n) const BOOST_NOEXCEPT
1567
2138
  {
1568
2139
  return const_local_iterator
1569
- ( pointer_traits<bucket_ptr>::const_cast_from(this->priv_bucket_pointer())[n].end()
2140
+ ( this->priv_bucket_lend(n)
1570
2141
  , this->priv_value_traits_ptr());
1571
2142
  }
1572
2143
 
1573
2144
  //Public functions for hashtable_impl
1574
2145
 
1575
- BOOST_INTRUSIVE_FORCEINLINE iterator begin()
1576
- { return iterator(this->priv_begin(), &this->get_bucket_value_traits()); }
2146
+ BOOST_INTRUSIVE_FORCEINLINE iterator begin() BOOST_NOEXCEPT
2147
+ {
2148
+ bucket_ptr p;
2149
+ siterator s = this->priv_begin(p);
2150
+ return this->build_iterator(s, p);
2151
+ }
1577
2152
 
1578
- BOOST_INTRUSIVE_FORCEINLINE const_iterator begin() const
2153
+ BOOST_INTRUSIVE_FORCEINLINE const_iterator begin() const BOOST_NOEXCEPT
1579
2154
  { return this->cbegin(); }
1580
2155
 
1581
- BOOST_INTRUSIVE_FORCEINLINE const_iterator cbegin() const
1582
- { return const_iterator(this->priv_begin(), &this->get_bucket_value_traits()); }
2156
+ BOOST_INTRUSIVE_FORCEINLINE const_iterator cbegin() const BOOST_NOEXCEPT
2157
+ {
2158
+ bucket_ptr p;
2159
+ siterator s = this->priv_begin(p);
2160
+ return this->build_const_iterator(s, p);
2161
+ }
1583
2162
 
1584
2163
  BOOST_INTRUSIVE_FORCEINLINE hasher hash_function() const
1585
2164
  { return this->priv_hasher(); }
@@ -1588,6 +2167,23 @@ struct hashdata_internal
1588
2167
  { return this->priv_equal(); }
1589
2168
  };
1590
2169
 
2170
+ template< class ValueTraits, class VoidOrKeyOfValue, class VoidOrKeyHash
2171
+ , class VoidOrKeyEqual, class BucketTraits, class SizeType
2172
+ , std::size_t BoolFlags>
2173
+ struct get_hashtable_size_wrapper_internal
2174
+ {
2175
+ typedef hashtable_size_wrapper
2176
+ < hashdata_internal
2177
+ < ValueTraits
2178
+ , VoidOrKeyOfValue, VoidOrKeyHash, VoidOrKeyEqual
2179
+ , BucketTraits, SizeType
2180
+ , BoolFlags & ~(hash_bool_flags::constant_time_size_pos) //1
2181
+ >
2182
+ , SizeType
2183
+ , (BoolFlags& hash_bool_flags::constant_time_size_pos) != 0
2184
+ > type;
2185
+ };
2186
+
1591
2187
  /// @endcond
1592
2188
 
1593
2189
  //! The class template hashtable is an intrusive hash table container, that
@@ -1632,27 +2228,13 @@ template<class T, class ...Options>
1632
2228
  template<class ValueTraits, class VoidOrKeyOfValue, class VoidOrKeyHash, class VoidOrKeyEqual, class BucketTraits, class SizeType, std::size_t BoolFlags>
1633
2229
  #endif
1634
2230
  class hashtable_impl
1635
- : private hashtable_size_traits_wrapper
1636
- < hashdata_internal
1637
- < ValueTraits
1638
- , VoidOrKeyOfValue, VoidOrKeyHash, VoidOrKeyEqual
1639
- , BucketTraits, SizeType
1640
- , BoolFlags & (hash_bool_flags::incremental_pos | hash_bool_flags::cache_begin_pos) //1
1641
- >
1642
- , SizeType
1643
- , (BoolFlags & hash_bool_flags::constant_time_size_pos) != 0
1644
- >
2231
+ : private get_hashtable_size_wrapper_internal
2232
+ <ValueTraits, VoidOrKeyOfValue, VoidOrKeyHash, VoidOrKeyEqual, BucketTraits, SizeType, BoolFlags>::type
1645
2233
  {
1646
- typedef hashtable_size_traits_wrapper
1647
- < hashdata_internal
1648
- < ValueTraits
1649
- , VoidOrKeyOfValue, VoidOrKeyHash, VoidOrKeyEqual
1650
- , BucketTraits, SizeType
1651
- , BoolFlags & (hash_bool_flags::incremental_pos | hash_bool_flags::cache_begin_pos) //1
1652
- >
1653
- , SizeType
1654
- , (BoolFlags & hash_bool_flags::constant_time_size_pos) != 0
1655
- > internal_type;
2234
+ static const bool linear_buckets_flag = (BoolFlags & hash_bool_flags::linear_buckets_pos) != 0;
2235
+ typedef typename get_hashtable_size_wrapper_internal
2236
+ <ValueTraits, VoidOrKeyOfValue, VoidOrKeyHash, VoidOrKeyEqual, BucketTraits, SizeType, BoolFlags>::type
2237
+ internal_type;
1656
2238
  typedef typename internal_type::size_traits size_traits;
1657
2239
  typedef hash_key_types_base
1658
2240
  < typename ValueTraits::value_type
@@ -1664,10 +2246,14 @@ class hashtable_impl
1664
2246
  /// @cond
1665
2247
  typedef BucketTraits bucket_traits;
1666
2248
 
1667
- typedef typename internal_type::slist_impl slist_impl;
1668
- typedef bucket_plus_vtraits<ValueTraits, BucketTraits> bucket_plus_vtraits_t;
2249
+ typedef bucket_plus_vtraits
2250
+ <ValueTraits, BucketTraits, linear_buckets_flag> bucket_plus_vtraits_t;
1669
2251
  typedef typename bucket_plus_vtraits_t::const_value_traits_ptr const_value_traits_ptr;
1670
2252
 
2253
+ typedef detail::bool_<linear_buckets_flag> linear_buckets_t;
2254
+
2255
+ typedef typename internal_type::siterator siterator;
2256
+ typedef typename internal_type::const_siterator const_siterator;
1671
2257
  using internal_type::begin;
1672
2258
  using internal_type::cbegin;
1673
2259
  using internal_type::end;
@@ -1697,10 +2283,8 @@ class hashtable_impl
1697
2283
  typedef SizeType size_type;
1698
2284
  typedef typename internal_type::key_equal key_equal;
1699
2285
  typedef typename internal_type::hasher hasher;
1700
- typedef bucket_impl<slist_impl> bucket_type;
2286
+ typedef typename internal_type::bucket_type bucket_type;
1701
2287
  typedef typename internal_type::bucket_ptr bucket_ptr;
1702
- typedef typename slist_impl::iterator siterator;
1703
- typedef typename slist_impl::const_iterator const_siterator;
1704
2288
  typedef typename internal_type::iterator iterator;
1705
2289
  typedef typename internal_type::const_iterator const_iterator;
1706
2290
  typedef typename internal_type::local_iterator local_iterator;
@@ -1717,7 +2301,7 @@ class hashtable_impl
1717
2301
  <node_ptr>::reference node_reference;
1718
2302
  typedef typename pointer_traits
1719
2303
  <const_node_ptr>::reference const_node_reference;
1720
- typedef typename slist_impl::node_algorithms node_algorithms;
2304
+ typedef typename internal_type::slist_node_algorithms slist_node_algorithms;
1721
2305
 
1722
2306
  static const bool stateful_value_traits = internal_type::stateful_value_traits;
1723
2307
  static const bool store_hash = internal_type::store_hash;
@@ -1728,9 +2312,10 @@ class hashtable_impl
1728
2312
  static const bool compare_hash = 0 != (BoolFlags & hash_bool_flags::compare_hash_pos);
1729
2313
  static const bool incremental = 0 != (BoolFlags & hash_bool_flags::incremental_pos);
1730
2314
  static const bool power_2_buckets = incremental || (0 != (BoolFlags & hash_bool_flags::power_2_buckets_pos));
1731
-
1732
- static const bool optimize_multikey
1733
- = detail::optimize_multikey_is_true<node_traits>::value && !unique_keys;
2315
+ static const bool optimize_multikey = optimize_multikey_is_true<node_traits>::value && !unique_keys;
2316
+ static const bool linear_buckets = linear_buckets_flag;
2317
+ static const bool fastmod_buckets = 0 != (BoolFlags & hash_bool_flags::fastmod_buckets_pos);
2318
+ static const std::size_t bucket_overhead = internal_type::bucket_overhead;
1734
2319
 
1735
2320
  /// @cond
1736
2321
  static const bool is_multikey = !unique_keys;
@@ -1740,7 +2325,11 @@ class hashtable_impl
1740
2325
  //See documentation for more explanations
1741
2326
  BOOST_STATIC_ASSERT((!compare_hash || store_hash));
1742
2327
 
1743
- typedef typename slist_impl::node_ptr slist_node_ptr;
2328
+ //Configuration error: fasmod_buckets<> can't be specified with incremental<> or power_2_buckets<>
2329
+ //See documentation for more explanations
2330
+ BOOST_STATIC_ASSERT(!(fastmod_buckets && power_2_buckets));
2331
+
2332
+ typedef typename internal_type::slist_node_ptr slist_node_ptr;
1744
2333
  typedef typename pointer_traits
1745
2334
  <slist_node_ptr>::template rebind_pointer
1746
2335
  < void >::type void_pointer;
@@ -1752,9 +2341,11 @@ class hashtable_impl
1752
2341
  typedef detail::bool_<optimize_multikey> optimize_multikey_t;
1753
2342
  typedef detail::bool_<cache_begin> cache_begin_t;
1754
2343
  typedef detail::bool_<power_2_buckets> power_2_buckets_t;
2344
+ typedef detail::bool_<fastmod_buckets> fastmod_buckets_t;
2345
+ typedef detail::bool_<compare_hash> compare_hash_t;
1755
2346
  typedef typename internal_type::split_traits split_traits;
1756
- typedef detail::group_functions<node_traits> group_functions_t;
1757
- typedef detail::node_functions<node_traits> node_functions_t;
2347
+ typedef group_functions<node_traits> group_functions_t;
2348
+ typedef node_functions<node_traits> node_functions_t;
1758
2349
 
1759
2350
  private:
1760
2351
  //noncopyable, movable
@@ -1767,27 +2358,37 @@ class hashtable_impl
1767
2358
  //Cache begin is incompatible with auto-unlink hooks!
1768
2359
  BOOST_STATIC_ASSERT(!(cache_begin && ((int)value_traits::link_mode == (int)auto_unlink)));
1769
2360
 
1770
- template<class Disposer>
1771
- struct typeof_node_disposer
1772
- {
1773
- typedef node_cast_adaptor
1774
- < detail::node_disposer< Disposer, value_traits, CircularSListAlgorithms>
1775
- , slist_node_ptr, node_ptr > type;
1776
- };
1777
2361
 
1778
- template<class Disposer>
1779
- typename typeof_node_disposer<Disposer>::type
1780
- make_node_disposer(const Disposer &disposer) const
2362
+ /// @endcond
2363
+
2364
+ public:
2365
+ typedef insert_commit_data_impl<store_hash> insert_commit_data;
2366
+
2367
+ private:
2368
+ void default_init_actions()
1781
2369
  {
1782
- typedef typename typeof_node_disposer<Disposer>::type return_t;
1783
- return return_t(disposer, &this->priv_value_traits());
2370
+ this->priv_set_sentinel_bucket();
2371
+ this->priv_init_buckets_and_cache();
2372
+ this->priv_size_count(size_type(0));
2373
+ size_type bucket_sz = this->bucket_count();
2374
+ BOOST_INTRUSIVE_INVARIANT_ASSERT(bucket_sz != 0);
2375
+ //Check power of two bucket array if the option is activated
2376
+ BOOST_INTRUSIVE_INVARIANT_ASSERT
2377
+ (!power_2_buckets || (0 == (bucket_sz & (bucket_sz - 1))));
2378
+ this->split_count(this->initial_split_from_bucket_count(bucket_sz));
1784
2379
  }
1785
2380
 
1786
- /// @endcond
2381
+ BOOST_INTRUSIVE_FORCEINLINE SizeType priv_size_count() const BOOST_NOEXCEPT
2382
+ { return this->internal_type::get_hashtable_size_wrapper_size(); }
1787
2383
 
1788
- public:
1789
- typedef detail::insert_commit_data_impl insert_commit_data;
2384
+ BOOST_INTRUSIVE_FORCEINLINE void priv_size_count(SizeType s) BOOST_NOEXCEPT
2385
+ { this->internal_type::set_hashtable_size_wrapper_size(s); }
2386
+
2387
+ BOOST_INTRUSIVE_FORCEINLINE void priv_size_inc() BOOST_NOEXCEPT
2388
+ { this->internal_type::inc_hashtable_size_wrapper_size(); }
1790
2389
 
2390
+ BOOST_INTRUSIVE_FORCEINLINE void priv_size_dec() BOOST_NOEXCEPT
2391
+ { this->internal_type::dec_hashtable_size_wrapper_size(); }
1791
2392
 
1792
2393
  public:
1793
2394
 
@@ -1809,16 +2410,7 @@ class hashtable_impl
1809
2410
  , const key_equal &equal_func = key_equal()
1810
2411
  , const value_traits &v_traits = value_traits())
1811
2412
  : internal_type(v_traits, b_traits, hash_func, equal_func)
1812
- {
1813
- this->priv_initialize_buckets_and_cache();
1814
- this->priv_size_traits().set_size(size_type(0));
1815
- size_type bucket_sz = this->bucket_count();
1816
- BOOST_INTRUSIVE_INVARIANT_ASSERT(bucket_sz != 0);
1817
- //Check power of two bucket array if the option is activated
1818
- BOOST_INTRUSIVE_INVARIANT_ASSERT
1819
- (!power_2_buckets || (0 == (bucket_sz & (bucket_sz-1))));
1820
- this->priv_split_traits().set_size(bucket_sz>>1);
1821
- }
2413
+ { this->default_init_actions(); }
1822
2414
 
1823
2415
  //! <b>Requires</b>: buckets must not be being used by any other resource
1824
2416
  //! and dereferencing iterator must yield an lvalue of type value_type.
@@ -1843,14 +2435,8 @@ class hashtable_impl
1843
2435
  , const value_traits &v_traits = value_traits())
1844
2436
  : internal_type(v_traits, b_traits, hash_func, equal_func)
1845
2437
  {
1846
- this->priv_initialize_buckets_and_cache();
1847
- this->priv_size_traits().set_size(size_type(0));
1848
- size_type bucket_sz = this->bucket_count();
1849
- BOOST_INTRUSIVE_INVARIANT_ASSERT(bucket_sz != 0);
1850
- //Check power of two bucket array if the option is activated
1851
- BOOST_INTRUSIVE_INVARIANT_ASSERT
1852
- (!power_2_buckets || (0 == (bucket_sz & (bucket_sz-1))));
1853
- this->priv_split_traits().set_size(bucket_sz>>1);
2438
+ this->default_init_actions();
2439
+
1854
2440
  //Now insert
1855
2441
  if(unique)
1856
2442
  this->insert_unique(b, e);
@@ -1868,18 +2454,14 @@ class hashtable_impl
1868
2454
  //! move constructor throws (this does not happen with predefined Boost.Intrusive hooks)
1869
2455
  //! or the move constructor of value traits, bucket traits, hasher or comparison throws.
1870
2456
  hashtable_impl(BOOST_RV_REF(hashtable_impl) x)
1871
- : internal_type( ::boost::move(x.priv_value_traits())
1872
- , ::boost::move(x.priv_bucket_traits())
1873
- , ::boost::move(x.priv_hasher())
1874
- , ::boost::move(x.priv_equal())
1875
- )
2457
+ : internal_type(BOOST_MOVE_BASE(internal_type, x))
1876
2458
  {
1877
2459
  this->priv_swap_cache(x);
1878
- x.priv_initialize_cache();
1879
- this->priv_size_traits().set_size(x.priv_size_traits().get_size());
1880
- x.priv_size_traits().set_size(size_type(0));
1881
- this->priv_split_traits().set_size(x.priv_split_traits().get_size());
1882
- x.priv_split_traits().set_size(size_type(0));
2460
+ x.priv_init_cache();
2461
+ this->priv_size_count(x.priv_size_count());
2462
+ x.priv_size_count(size_type(0));
2463
+ this->split_count(x.split_count());
2464
+ x.split_count(size_type(0));
1883
2465
  }
1884
2466
 
1885
2467
  //! <b>Effects</b>: Equivalent to swap.
@@ -1887,7 +2469,6 @@ class hashtable_impl
1887
2469
  hashtable_impl& operator=(BOOST_RV_REF(hashtable_impl) x)
1888
2470
  { this->swap(x); return *this; }
1889
2471
 
1890
- #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
1891
2472
  //! <b>Effects</b>: Detaches all elements from this. The objects in the unordered_set
1892
2473
  //! are not deleted (i.e. no destructors are called).
1893
2474
  //!
@@ -1895,15 +2476,17 @@ class hashtable_impl
1895
2476
  //! it's a safe-mode or auto-unlink value. Otherwise constant.
1896
2477
  //!
1897
2478
  //! <b>Throws</b>: Nothing.
1898
- ~hashtable_impl();
2479
+ ~hashtable_impl()
2480
+ {}
1899
2481
 
2482
+ #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
1900
2483
  //! <b>Effects</b>: Returns an iterator pointing to the beginning of the unordered_set.
1901
2484
  //!
1902
2485
  //! <b>Complexity</b>: Amortized constant time.
1903
2486
  //! Worst case (empty unordered_set): O(this->bucket_count())
1904
2487
  //!
1905
2488
  //! <b>Throws</b>: Nothing.
1906
- iterator begin();
2489
+ iterator begin() BOOST_NOEXCEPT;
1907
2490
 
1908
2491
  //! <b>Effects</b>: Returns a const_iterator pointing to the beginning
1909
2492
  //! of the unordered_set.
@@ -1912,7 +2495,7 @@ class hashtable_impl
1912
2495
  //! Worst case (empty unordered_set): O(this->bucket_count())
1913
2496
  //!
1914
2497
  //! <b>Throws</b>: Nothing.
1915
- const_iterator begin() const;
2498
+ const_iterator begin() const BOOST_NOEXCEPT;
1916
2499
 
1917
2500
  //! <b>Effects</b>: Returns a const_iterator pointing to the beginning
1918
2501
  //! of the unordered_set.
@@ -1921,28 +2504,28 @@ class hashtable_impl
1921
2504
  //! Worst case (empty unordered_set): O(this->bucket_count())
1922
2505
  //!
1923
2506
  //! <b>Throws</b>: Nothing.
1924
- const_iterator cbegin() const;
2507
+ const_iterator cbegin() const BOOST_NOEXCEPT;
1925
2508
 
1926
2509
  //! <b>Effects</b>: Returns an iterator pointing to the end of the unordered_set.
1927
2510
  //!
1928
2511
  //! <b>Complexity</b>: Constant.
1929
2512
  //!
1930
2513
  //! <b>Throws</b>: Nothing.
1931
- iterator end();
2514
+ iterator end() BOOST_NOEXCEPT;
1932
2515
 
1933
2516
  //! <b>Effects</b>: Returns a const_iterator pointing to the end of the unordered_set.
1934
2517
  //!
1935
2518
  //! <b>Complexity</b>: Constant.
1936
2519
  //!
1937
2520
  //! <b>Throws</b>: Nothing.
1938
- const_iterator end() const;
2521
+ const_iterator end() const BOOST_NOEXCEPT;
1939
2522
 
1940
2523
  //! <b>Effects</b>: Returns a const_iterator pointing to the end of the unordered_set.
1941
2524
  //!
1942
2525
  //! <b>Complexity</b>: Constant.
1943
2526
  //!
1944
2527
  //! <b>Throws</b>: Nothing.
1945
- const_iterator cend() const;
2528
+ const_iterator cend() const BOOST_NOEXCEPT;
1946
2529
 
1947
2530
  //! <b>Effects</b>: Returns the hasher object used by the unordered_set.
1948
2531
  //!
@@ -1967,9 +2550,9 @@ class hashtable_impl
1967
2550
  //! Otherwise constant.
1968
2551
  //!
1969
2552
  //! <b>Throws</b>: Nothing.
1970
- bool empty() const
2553
+ bool empty() const BOOST_NOEXCEPT
1971
2554
  {
1972
- if(constant_time_size){
2555
+ BOOST_IF_CONSTEXPR(constant_time_size){
1973
2556
  return !this->size();
1974
2557
  }
1975
2558
  else if(cache_begin){
@@ -1979,7 +2562,7 @@ class hashtable_impl
1979
2562
  size_type bucket_cnt = this->bucket_count();
1980
2563
  const bucket_type *b = boost::movelib::to_raw_pointer(this->priv_bucket_pointer());
1981
2564
  for (size_type n = 0; n < bucket_cnt; ++n, ++b){
1982
- if(!b->empty()){
2565
+ if(!slist_node_algorithms::is_empty(b->get_node_ptr())){
1983
2566
  return false;
1984
2567
  }
1985
2568
  }
@@ -1993,18 +2576,19 @@ class hashtable_impl
1993
2576
  //! constant_time_size is false. Constant-time otherwise.
1994
2577
  //!
1995
2578
  //! <b>Throws</b>: Nothing.
1996
- size_type size() const
2579
+ size_type size() const BOOST_NOEXCEPT
1997
2580
  {
1998
- if(constant_time_size)
1999
- return this->priv_size_traits().get_size();
2581
+ BOOST_IF_CONSTEXPR(constant_time_size)
2582
+ return this->priv_size_count();
2000
2583
  else{
2001
- size_type len = 0;
2002
- size_type bucket_cnt = this->bucket_count();
2584
+ std::size_t len = 0;
2585
+ std::size_t bucket_cnt = this->bucket_count();
2003
2586
  const bucket_type *b = boost::movelib::to_raw_pointer(this->priv_bucket_pointer());
2004
- for (size_type n = 0; n < bucket_cnt; ++n, ++b){
2005
- len += b->size();
2587
+ for (std::size_t n = 0; n < bucket_cnt; ++n, ++b){
2588
+ len += slist_node_algorithms::count(b->get_node_ptr()) - 1u;
2006
2589
  }
2007
- return len;
2590
+ BOOST_INTRUSIVE_INVARIANT_ASSERT((len <= SizeType(-1)));
2591
+ return size_type(len);
2008
2592
  }
2009
2593
  }
2010
2594
 
@@ -2096,7 +2680,7 @@ class hashtable_impl
2096
2680
  siterator prev;
2097
2681
  siterator const it = this->priv_find
2098
2682
  (key_of_value()(value), this->priv_hasher(), this->priv_equal(), bucket_num, hash_value, prev);
2099
- bool const next_is_in_group = optimize_multikey && it != this->priv_invalid_local_it();
2683
+ bool const next_is_in_group = optimize_multikey && it != this->priv_end_sit();
2100
2684
  return this->priv_insert_equal_after_find(value, bucket_num, hash_value, prev, next_is_in_group);
2101
2685
  }
2102
2686
 
@@ -2206,12 +2790,15 @@ class hashtable_impl
2206
2790
  , KeyEqual equal_func
2207
2791
  , insert_commit_data &commit_data)
2208
2792
  {
2209
- size_type bucket_num;
2210
- siterator prev;
2211
- siterator const pos = this->priv_find(key, hash_func, equal_func, bucket_num, commit_data.hash, prev);
2212
- return std::pair<iterator, bool>
2213
- ( iterator(pos, &this->get_bucket_value_traits())
2214
- , pos == this->priv_invalid_local_it());
2793
+ const std::size_t h = hash_func(key);
2794
+ const std::size_t bn = this->priv_hash_to_nbucket(h);
2795
+
2796
+ commit_data.bucket_idx = bn;
2797
+ commit_data.set_hash(h);
2798
+
2799
+ bucket_ptr bp = this->priv_bucket_ptr(bn);
2800
+ siterator const s = this->priv_find_in_bucket(*bp, key, equal_func, h);
2801
+ return std::pair<iterator, bool>(this->build_iterator(s, bp), s == this->priv_end_sit());
2215
2802
  }
2216
2803
 
2217
2804
  //! <b>Effects</b>: Checks if a value can be inserted in the unordered_set, using
@@ -2264,17 +2851,17 @@ class hashtable_impl
2264
2851
  //! erased between the "insert_check" and "insert_commit" calls.
2265
2852
  //!
2266
2853
  //! After a successful rehashing insert_commit_data remains valid.
2267
- iterator insert_unique_commit(reference value, const insert_commit_data &commit_data)
2268
- {
2269
- size_type bucket_num = this->priv_hash_to_bucket(commit_data.hash);
2270
- bucket_type &b = this->priv_bucket_pointer()[bucket_num];
2271
- this->priv_size_traits().increment();
2272
- node_ptr const n = pointer_traits<node_ptr>::pointer_to(this->priv_value_to_node(value));
2273
- BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!safemode_or_autounlink || node_algorithms::unique(n));
2274
- node_functions_t::store_hash(n, commit_data.hash, store_hash_t());
2275
- this->priv_insertion_update_cache(bucket_num);
2854
+ iterator insert_unique_commit(reference value, const insert_commit_data &commit_data) BOOST_NOEXCEPT
2855
+ {
2856
+ this->priv_size_inc();
2857
+ node_ptr const n = this->priv_value_to_node_ptr(value);
2858
+ BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!safemode_or_autounlink || slist_node_algorithms::unique(n));
2859
+ node_functions_t::store_hash(n, commit_data.get_hash(), store_hash_t());
2860
+ this->priv_insertion_update_cache(static_cast<size_type>(commit_data.bucket_idx));
2276
2861
  group_functions_t::insert_in_group(n, n, optimize_multikey_t());
2277
- return iterator(b.insert_after(b.before_begin(), *n), &this->get_bucket_value_traits());
2862
+ bucket_type& b = this->priv_bucket(commit_data.bucket_idx);
2863
+ slist_node_algorithms::link_after(b.get_node_ptr(), n);
2864
+ return this->build_iterator(siterator(n), this->to_ptr(b));
2278
2865
  }
2279
2866
 
2280
2867
  //! <b>Effects</b>: Erases the element pointed to by i.
@@ -2285,7 +2872,7 @@ class hashtable_impl
2285
2872
  //!
2286
2873
  //! <b>Note</b>: Invalidates the iterators (but not the references)
2287
2874
  //! to the erased element. No destructors are called.
2288
- BOOST_INTRUSIVE_FORCEINLINE void erase(const_iterator i)
2875
+ BOOST_INTRUSIVE_FORCEINLINE void erase(const_iterator i) BOOST_NOEXCEPT
2289
2876
  { this->erase_and_dispose(i, detail::null_disposer()); }
2290
2877
 
2291
2878
  //! <b>Effects</b>: Erases the range pointed to by b end e.
@@ -2297,7 +2884,7 @@ class hashtable_impl
2297
2884
  //!
2298
2885
  //! <b>Note</b>: Invalidates the iterators (but not the references)
2299
2886
  //! to the erased elements. No destructors are called.
2300
- BOOST_INTRUSIVE_FORCEINLINE void erase(const_iterator b, const_iterator e)
2887
+ BOOST_INTRUSIVE_FORCEINLINE void erase(const_iterator b, const_iterator e) BOOST_NOEXCEPT
2301
2888
  { this->erase_and_dispose(b, e, detail::null_disposer()); }
2302
2889
 
2303
2890
  //! <b>Effects</b>: Erases all the elements with the given value.
@@ -2353,14 +2940,13 @@ class hashtable_impl
2353
2940
  template<class Disposer>
2354
2941
  BOOST_INTRUSIVE_DOC1ST(void
2355
2942
  , typename detail::disable_if_convertible<Disposer BOOST_INTRUSIVE_I const_iterator>::type)
2356
- erase_and_dispose(const_iterator i, Disposer disposer)
2943
+ erase_and_dispose(const_iterator i, Disposer disposer) BOOST_NOEXCEPT
2357
2944
  {
2358
2945
  //Get the bucket number and local iterator for both iterators
2359
- siterator const first_local_it(i.slist_it());
2360
- size_type const first_bucket_num = this->priv_get_bucket_num(first_local_it);
2361
- this->priv_erase_node(this->priv_bucket_pointer()[first_bucket_num], first_local_it, make_node_disposer(disposer), optimize_multikey_t());
2362
- this->priv_size_traits().decrement();
2363
- this->priv_erasure_update_cache_range(first_bucket_num, first_bucket_num);
2946
+ const bucket_ptr bp = this->priv_get_bucket_ptr(i);
2947
+ this->priv_erase_node(*bp, i.slist_it(), this->make_node_disposer(disposer), optimize_multikey_t());
2948
+ this->priv_size_dec();
2949
+ this->priv_erasure_update_cache(bp);
2364
2950
  }
2365
2951
 
2366
2952
  //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -2376,33 +2962,31 @@ class hashtable_impl
2376
2962
  //! <b>Note</b>: Invalidates the iterators
2377
2963
  //! to the erased elements.
2378
2964
  template<class Disposer>
2379
- void erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer)
2965
+ void erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer) BOOST_NOEXCEPT
2380
2966
  {
2381
2967
  if(b != e){
2382
2968
  //Get the bucket number and local iterator for both iterators
2383
- siterator first_local_it(b.slist_it());
2384
- size_type first_bucket_num = this->priv_get_bucket_num(first_local_it);
2969
+ size_type first_bucket_num = this->priv_get_bucket_num(b);
2385
2970
 
2386
- const bucket_ptr buck_ptr = this->priv_bucket_pointer();
2387
2971
  siterator before_first_local_it
2388
- = this->priv_get_previous(buck_ptr[first_bucket_num], first_local_it);
2972
+ = this->priv_get_previous(this->priv_bucket(first_bucket_num), b.slist_it(), optimize_multikey_t());
2389
2973
  size_type last_bucket_num;
2390
2974
  siterator last_local_it;
2391
2975
 
2392
2976
  //For the end iterator, we will assign the end iterator
2393
2977
  //of the last bucket
2394
2978
  if(e == this->end()){
2395
- last_bucket_num = this->bucket_count() - 1;
2396
- last_local_it = buck_ptr[last_bucket_num].end();
2979
+ last_bucket_num = size_type(this->bucket_count() - 1u);
2980
+ last_local_it = this->sit_end(this->priv_bucket(last_bucket_num));
2397
2981
  }
2398
2982
  else{
2399
2983
  last_local_it = e.slist_it();
2400
- last_bucket_num = this->priv_get_bucket_num(last_local_it);
2984
+ last_bucket_num = this->priv_get_bucket_num(e);
2401
2985
  }
2402
- size_type const num_erased = this->priv_erase_node_range
2986
+ size_type const num_erased = (size_type)this->priv_erase_node_range
2403
2987
  ( before_first_local_it, first_bucket_num, last_local_it, last_bucket_num
2404
- , make_node_disposer(disposer), optimize_multikey_t());
2405
- this->priv_size_traits().set_size(this->priv_size_traits().get_size()-num_erased);
2988
+ , this->make_node_disposer(disposer), optimize_multikey_t());
2989
+ this->priv_size_count(size_type(this->priv_size_count()-num_erased));
2406
2990
  this->priv_erasure_update_cache_range(first_bucket_num, last_bucket_num);
2407
2991
  }
2408
2992
  }
@@ -2449,30 +3033,34 @@ class hashtable_impl
2449
3033
  std::size_t h;
2450
3034
  siterator prev;
2451
3035
  siterator it = this->priv_find(key, hash_func, equal_func, bucket_num, h, prev);
2452
- bool const success = it != this->priv_invalid_local_it();
3036
+ bool const success = it != this->priv_end_sit();
2453
3037
 
2454
- size_type cnt(0);
3038
+ std::size_t cnt(0);
2455
3039
  if(success){
2456
3040
  if(optimize_multikey){
3041
+ siterator past_last_in_group = it;
3042
+ (priv_go_to_last_in_group)(past_last_in_group, optimize_multikey_t());
3043
+ ++past_last_in_group;
2457
3044
  cnt = this->priv_erase_from_single_bucket
2458
- (this->priv_bucket_pointer()[bucket_num], prev, ++(priv_last_in_group)(it), make_node_disposer(disposer), optimize_multikey_t());
3045
+ ( this->priv_bucket(bucket_num), prev
3046
+ , past_last_in_group
3047
+ , this->make_node_disposer(disposer), optimize_multikey_t());
2459
3048
  }
2460
3049
  else{
2461
- bucket_type &b = this->priv_bucket_pointer()[bucket_num];
2462
- siterator const end_sit = b.end();
3050
+ siterator const end_sit = this->priv_bucket_lend(bucket_num);
2463
3051
  do{
2464
3052
  ++cnt;
2465
3053
  ++it;
2466
3054
  }while(it != end_sit &&
2467
- this->priv_is_value_equal_to_key
2468
- (this->priv_value_from_slist_node(it.pointed_node()), h, key, equal_func));
2469
- bucket_type::s_erase_after_and_dispose(prev, it, make_node_disposer(disposer));
3055
+ this->priv_is_value_equal_to_key
3056
+ (this->priv_value_from_siterator(it), h, key, equal_func, compare_hash_t()));
3057
+ slist_node_algorithms::unlink_after_and_dispose(prev.pointed_node(), it.pointed_node(), this->make_node_disposer(disposer));
2470
3058
  }
2471
- this->priv_size_traits().set_size(this->priv_size_traits().get_size()-cnt);
3059
+ this->priv_size_count(size_type(this->priv_size_count()-cnt));
2472
3060
  this->priv_erasure_update_cache();
2473
3061
  }
2474
3062
 
2475
- return cnt;
3063
+ return static_cast<size_type>(cnt);
2476
3064
  }
2477
3065
 
2478
3066
  //! <b>Effects</b>: Erases all of the elements.
@@ -2484,10 +3072,10 @@ class hashtable_impl
2484
3072
  //!
2485
3073
  //! <b>Note</b>: Invalidates the iterators (but not the references)
2486
3074
  //! to the erased elements. No destructors are called.
2487
- void clear()
3075
+ void clear() BOOST_NOEXCEPT
2488
3076
  {
2489
3077
  this->priv_clear_buckets_and_cache();
2490
- this->priv_size_traits().set_size(size_type(0));
3078
+ this->priv_size_count(size_type(0));
2491
3079
  }
2492
3080
 
2493
3081
  //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -2502,18 +3090,19 @@ class hashtable_impl
2502
3090
  //! <b>Note</b>: Invalidates the iterators (but not the references)
2503
3091
  //! to the erased elements. No destructors are called.
2504
3092
  template<class Disposer>
2505
- void clear_and_dispose(Disposer disposer)
3093
+ void clear_and_dispose(Disposer disposer) BOOST_NOEXCEPT
2506
3094
  {
2507
3095
  if(!constant_time_size || !this->empty()){
2508
3096
  size_type num_buckets = this->bucket_count();
2509
3097
  bucket_ptr b = this->priv_bucket_pointer();
2510
- typename typeof_node_disposer<Disposer>::type d(disposer, &this->priv_value_traits());
2511
- for(; num_buckets--; ++b){
2512
- b->clear_and_dispose(d);
3098
+ typename internal_type::template typeof_node_disposer<Disposer>::type d(disposer, &this->priv_value_traits());
3099
+ for(; num_buckets; ++b){
3100
+ --num_buckets;
3101
+ slist_node_algorithms::detach_and_dispose(b->get_node_ptr(), d);
2513
3102
  }
2514
- this->priv_size_traits().set_size(size_type(0));
3103
+ this->priv_size_count(size_type(0));
2515
3104
  }
2516
- this->priv_initialize_cache();
3105
+ this->priv_init_cache();
2517
3106
  }
2518
3107
 
2519
3108
  //! <b>Effects</b>: Returns the number of contained elements with the given value
@@ -2577,11 +3166,10 @@ class hashtable_impl
2577
3166
  template<class KeyType, class KeyHasher, class KeyEqual>
2578
3167
  iterator find(const KeyType &key, KeyHasher hash_func, KeyEqual equal_func)
2579
3168
  {
2580
- size_type bucket_n;
2581
- std::size_t hash;
2582
- siterator prev;
2583
- return iterator( this->priv_find(key, hash_func, equal_func, bucket_n, hash, prev)
2584
- , &this->get_bucket_value_traits());
3169
+ std::size_t h = hash_func(key);
3170
+ bucket_ptr bp = this->priv_hash_to_bucket_ptr(h);
3171
+ siterator s = this->priv_find_in_bucket(*bp, key, equal_func, h);
3172
+ return this->build_iterator(s, bp);
2585
3173
  }
2586
3174
 
2587
3175
  //! <b>Effects</b>: Finds a const_iterator to the first element whose key is
@@ -2616,11 +3204,10 @@ class hashtable_impl
2616
3204
  const_iterator find
2617
3205
  (const KeyType &key, KeyHasher hash_func, KeyEqual equal_func) const
2618
3206
  {
2619
- size_type bucket_n;
2620
- std::size_t hash_value;
2621
- siterator prev;
2622
- return const_iterator( this->priv_find(key, hash_func, equal_func, bucket_n, hash_value, prev)
2623
- , &this->get_bucket_value_traits());
3207
+ std::size_t h = hash_func(key);
3208
+ bucket_ptr bp = this->priv_hash_to_bucket_ptr(h);
3209
+ siterator s = this->priv_find_in_bucket(*bp, key, equal_func, h);
3210
+ return this->build_const_iterator(s, bp);
2624
3211
  }
2625
3212
 
2626
3213
  //! <b>Effects</b>: Returns a range containing all elements with values equivalent
@@ -2657,11 +3244,11 @@ class hashtable_impl
2657
3244
  std::pair<iterator,iterator> equal_range
2658
3245
  (const KeyType &key, KeyHasher hash_func, KeyEqual equal_func)
2659
3246
  {
2660
- std::pair<siterator, siterator> ret =
3247
+ priv_equal_range_result ret =
2661
3248
  this->priv_equal_range(key, hash_func, equal_func);
2662
3249
  return std::pair<iterator, iterator>
2663
- ( iterator(ret.first, &this->get_bucket_value_traits())
2664
- , iterator(ret.second, &this->get_bucket_value_traits()));
3250
+ ( this->build_iterator(ret.first, ret.bucket_first)
3251
+ , this->build_iterator(ret.second, ret.bucket_second));
2665
3252
  }
2666
3253
 
2667
3254
  //! <b>Effects</b>: Returns a range containing all elements with values equivalent
@@ -2699,11 +3286,11 @@ class hashtable_impl
2699
3286
  std::pair<const_iterator,const_iterator> equal_range
2700
3287
  (const KeyType &key, KeyHasher hash_func, KeyEqual equal_func) const
2701
3288
  {
2702
- std::pair<siterator, siterator> ret =
3289
+ priv_equal_range_result ret =
2703
3290
  this->priv_equal_range(key, hash_func, equal_func);
2704
3291
  return std::pair<const_iterator, const_iterator>
2705
- ( const_iterator(ret.first, &this->get_bucket_value_traits())
2706
- , const_iterator(ret.second, &this->get_bucket_value_traits()));
3292
+ ( this->build_const_iterator(ret.first, ret.bucket_first)
3293
+ , this->build_const_iterator(ret.second, ret.bucket_second));
2707
3294
  }
2708
3295
 
2709
3296
  #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
@@ -2717,7 +3304,7 @@ class hashtable_impl
2717
3304
  //! <b>Complexity</b>: Constant.
2718
3305
  //!
2719
3306
  //! <b>Throws</b>: If the internal hash function throws.
2720
- iterator iterator_to(reference value);
3307
+ iterator iterator_to(reference value) BOOST_NOEXCEPT;
2721
3308
 
2722
3309
  //! <b>Requires</b>: value must be an lvalue and shall be in a unordered_set of
2723
3310
  //! appropriate type. Otherwise the behavior is undefined.
@@ -2728,7 +3315,7 @@ class hashtable_impl
2728
3315
  //! <b>Complexity</b>: Constant.
2729
3316
  //!
2730
3317
  //! <b>Throws</b>: If the internal hash function throws.
2731
- const_iterator iterator_to(const_reference value) const;
3318
+ const_iterator iterator_to(const_reference value) const BOOST_NOEXCEPT;
2732
3319
 
2733
3320
  //! <b>Requires</b>: value must be an lvalue and shall be in a unordered_set of
2734
3321
  //! appropriate type. Otherwise the behavior is undefined.
@@ -2742,7 +3329,7 @@ class hashtable_impl
2742
3329
  //!
2743
3330
  //! <b>Note</b>: This static function is available only if the <i>value traits</i>
2744
3331
  //! is stateless.
2745
- static local_iterator s_local_iterator_to(reference value);
3332
+ static local_iterator s_local_iterator_to(reference value) BOOST_NOEXCEPT;
2746
3333
 
2747
3334
  //! <b>Requires</b>: value must be an lvalue and shall be in a unordered_set of
2748
3335
  //! appropriate type. Otherwise the behavior is undefined.
@@ -2756,7 +3343,7 @@ class hashtable_impl
2756
3343
  //!
2757
3344
  //! <b>Note</b>: This static function is available only if the <i>value traits</i>
2758
3345
  //! is stateless.
2759
- static const_local_iterator s_local_iterator_to(const_reference value);
3346
+ static const_local_iterator s_local_iterator_to(const_reference value) BOOST_NOEXCEPT;
2760
3347
 
2761
3348
  //! <b>Requires</b>: value must be an lvalue and shall be in a unordered_set of
2762
3349
  //! appropriate type. Otherwise the behavior is undefined.
@@ -2767,7 +3354,7 @@ class hashtable_impl
2767
3354
  //! <b>Complexity</b>: Constant.
2768
3355
  //!
2769
3356
  //! <b>Throws</b>: Nothing.
2770
- local_iterator local_iterator_to(reference value);
3357
+ local_iterator local_iterator_to(reference value) BOOST_NOEXCEPT;
2771
3358
 
2772
3359
  //! <b>Requires</b>: value must be an lvalue and shall be in a unordered_set of
2773
3360
  //! appropriate type. Otherwise the behavior is undefined.
@@ -2778,7 +3365,7 @@ class hashtable_impl
2778
3365
  //! <b>Complexity</b>: Constant.
2779
3366
  //!
2780
3367
  //! <b>Throws</b>: Nothing.
2781
- const_local_iterator local_iterator_to(const_reference value) const;
3368
+ const_local_iterator local_iterator_to(const_reference value) const BOOST_NOEXCEPT;
2782
3369
 
2783
3370
  //! <b>Effects</b>: Returns the number of buckets passed in the constructor
2784
3371
  //! or the last rehash function.
@@ -2786,7 +3373,7 @@ class hashtable_impl
2786
3373
  //! <b>Complexity</b>: Constant.
2787
3374
  //!
2788
3375
  //! <b>Throws</b>: Nothing.
2789
- size_type bucket_count() const;
3376
+ size_type bucket_count() const BOOST_NOEXCEPT;
2790
3377
 
2791
3378
  //! <b>Requires</b>: n is in the range [0, this->bucket_count()).
2792
3379
  //!
@@ -2795,7 +3382,7 @@ class hashtable_impl
2795
3382
  //! <b>Complexity</b>: Constant.
2796
3383
  //!
2797
3384
  //! <b>Throws</b>: Nothing.
2798
- size_type bucket_size(size_type n) const;
3385
+ size_type bucket_size(size_type n) const BOOST_NOEXCEPT;
2799
3386
  #endif //#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
2800
3387
 
2801
3388
  //! <b>Effects</b>: Returns the index of the bucket in which elements
@@ -2806,8 +3393,8 @@ class hashtable_impl
2806
3393
  //! <b>Throws</b>: If the hash functor throws.
2807
3394
  //!
2808
3395
  //! <b>Note</b>: the return value is in the range [0, this->bucket_count()).
2809
- BOOST_INTRUSIVE_FORCEINLINE size_type bucket(const key_type& k) const
2810
- { return this->bucket(k, this->priv_hasher()); }
3396
+ BOOST_INTRUSIVE_FORCEINLINE size_type bucket(const key_type& k) const
3397
+ { return this->priv_hash_to_nbucket(this->priv_hash(k)); }
2811
3398
 
2812
3399
  //! <b>Requires</b>: "hash_func" must be a hash function that induces
2813
3400
  //! the same hash values as the stored hasher. The difference is that
@@ -2823,7 +3410,7 @@ class hashtable_impl
2823
3410
  //! <b>Note</b>: the return value is in the range [0, this->bucket_count()).
2824
3411
  template<class KeyType, class KeyHasher>
2825
3412
  BOOST_INTRUSIVE_FORCEINLINE size_type bucket(const KeyType& k, KeyHasher hash_func) const
2826
- { return this->priv_hash_to_bucket(hash_func(k)); }
3413
+ { return this->priv_hash_to_nbucket(hash_func(k)); }
2827
3414
 
2828
3415
  #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
2829
3416
  //! <b>Effects</b>: Returns the bucket array pointer passed in the constructor
@@ -2832,7 +3419,7 @@ class hashtable_impl
2832
3419
  //! <b>Complexity</b>: Constant.
2833
3420
  //!
2834
3421
  //! <b>Throws</b>: Nothing.
2835
- bucket_ptr bucket_pointer() const;
3422
+ bucket_ptr bucket_pointer() const BOOST_NOEXCEPT;
2836
3423
 
2837
3424
  //! <b>Requires</b>: n is in the range [0, this->bucket_count()).
2838
3425
  //!
@@ -2845,7 +3432,7 @@ class hashtable_impl
2845
3432
  //!
2846
3433
  //! <b>Note</b>: [this->begin(n), this->end(n)) is a valid range
2847
3434
  //! containing all of the elements in the nth bucket.
2848
- local_iterator begin(size_type n);
3435
+ local_iterator begin(size_type n) BOOST_NOEXCEPT;
2849
3436
 
2850
3437
  //! <b>Requires</b>: n is in the range [0, this->bucket_count()).
2851
3438
  //!
@@ -2858,7 +3445,7 @@ class hashtable_impl
2858
3445
  //!
2859
3446
  //! <b>Note</b>: [this->begin(n), this->end(n)) is a valid range
2860
3447
  //! containing all of the elements in the nth bucket.
2861
- const_local_iterator begin(size_type n) const;
3448
+ const_local_iterator begin(size_type n) const BOOST_NOEXCEPT;
2862
3449
 
2863
3450
  //! <b>Requires</b>: n is in the range [0, this->bucket_count()).
2864
3451
  //!
@@ -2871,7 +3458,7 @@ class hashtable_impl
2871
3458
  //!
2872
3459
  //! <b>Note</b>: [this->begin(n), this->end(n)) is a valid range
2873
3460
  //! containing all of the elements in the nth bucket.
2874
- const_local_iterator cbegin(size_type n) const;
3461
+ const_local_iterator cbegin(size_type n) const BOOST_NOEXCEPT;
2875
3462
 
2876
3463
  //! <b>Requires</b>: n is in the range [0, this->bucket_count()).
2877
3464
  //!
@@ -2884,7 +3471,7 @@ class hashtable_impl
2884
3471
  //!
2885
3472
  //! <b>Note</b>: [this->begin(n), this->end(n)) is a valid range
2886
3473
  //! containing all of the elements in the nth bucket.
2887
- local_iterator end(size_type n);
3474
+ local_iterator end(size_type n) BOOST_NOEXCEPT;
2888
3475
 
2889
3476
  //! <b>Requires</b>: n is in the range [0, this->bucket_count()).
2890
3477
  //!
@@ -2897,7 +3484,7 @@ class hashtable_impl
2897
3484
  //!
2898
3485
  //! <b>Note</b>: [this->begin(n), this->end(n)) is a valid range
2899
3486
  //! containing all of the elements in the nth bucket.
2900
- const_local_iterator end(size_type n) const;
3487
+ const_local_iterator end(size_type n) const BOOST_NOEXCEPT;
2901
3488
 
2902
3489
  //! <b>Requires</b>: n is in the range [0, this->bucket_count()).
2903
3490
  //!
@@ -2910,7 +3497,7 @@ class hashtable_impl
2910
3497
  //!
2911
3498
  //! <b>Note</b>: [this->begin(n), this->end(n)) is a valid range
2912
3499
  //! containing all of the elements in the nth bucket.
2913
- const_local_iterator cend(size_type n) const;
3500
+ const_local_iterator cend(size_type n) const BOOST_NOEXCEPT;
2914
3501
  #endif //#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
2915
3502
 
2916
3503
  //! <b>Requires</b>: new_bucket_traits can hold a pointer to a new bucket array
@@ -2941,7 +3528,7 @@ class hashtable_impl
2941
3528
  //!
2942
3529
  //! <b>Throws</b>: If the hasher functor throws. Basic guarantee.
2943
3530
  BOOST_INTRUSIVE_FORCEINLINE void rehash(const bucket_traits &new_bucket_traits)
2944
- { this->rehash_impl(new_bucket_traits, false); }
3531
+ { this->priv_rehash_impl(new_bucket_traits, false); }
2945
3532
 
2946
3533
  //! <b>Note</b>: This function is used when keys from inserted elements are changed
2947
3534
  //! (e.g. a language change when key is a string) but uniqueness and hash properties are
@@ -2964,7 +3551,7 @@ class hashtable_impl
2964
3551
  //!
2965
3552
  //! <b>Throws</b>: If the hasher functor throws. Basic guarantee.
2966
3553
  BOOST_INTRUSIVE_FORCEINLINE void full_rehash()
2967
- { this->rehash_impl(this->priv_bucket_traits(), true); }
3554
+ { this->priv_rehash_impl(this->priv_bucket_traits(), true); }
2968
3555
 
2969
3556
  //! <b>Requires</b>:
2970
3557
  //!
@@ -2979,47 +3566,49 @@ class hashtable_impl
2979
3566
  {
2980
3567
  //This function is only available for containers with incremental hashing
2981
3568
  BOOST_STATIC_ASSERT(( incremental && power_2_buckets ));
2982
- const size_type split_idx = this->priv_split_traits().get_size();
2983
- const size_type bucket_cnt = this->bucket_count();
2984
- const bucket_ptr buck_ptr = this->priv_bucket_pointer();
3569
+ const std::size_t split_idx = this->split_count();
3570
+ const std::size_t bucket_cnt = this->bucket_count();
2985
3571
  bool ret = false;
2986
3572
 
2987
3573
  if(grow){
2988
3574
  //Test if the split variable can be changed
2989
3575
  if((ret = split_idx < bucket_cnt)){
2990
- const size_type bucket_to_rehash = split_idx - bucket_cnt/2;
2991
- bucket_type &old_bucket = buck_ptr[bucket_to_rehash];
2992
- this->priv_split_traits().increment();
3576
+ const std::size_t bucket_to_rehash = split_idx - bucket_cnt/2u;
3577
+ bucket_type &old_bucket = this->priv_bucket(bucket_to_rehash);
3578
+ this->inc_split_count();
2993
3579
 
2994
3580
  //Anti-exception stuff: if an exception is thrown while
2995
3581
  //moving elements from old_bucket to the target bucket, all moved
2996
3582
  //elements are moved back to the original one.
2997
- detail::incremental_rehash_rollback<bucket_type, split_traits> rollback
2998
- ( buck_ptr[split_idx], old_bucket, this->priv_split_traits());
2999
- for( siterator before_i(old_bucket.before_begin()), i(old_bucket.begin()), end_sit(old_bucket.end())
3000
- ; i != end_sit; i = before_i, ++i){
3001
- const value_type &v = this->priv_value_from_slist_node(i.pointed_node());
3583
+ incremental_rehash_rollback<bucket_type, split_traits, slist_node_algorithms> rollback
3584
+ ( this->priv_bucket(split_idx), old_bucket, this->priv_split_traits());
3585
+ siterator before_i(old_bucket.get_node_ptr());
3586
+ siterator i(before_i); ++i;
3587
+ siterator end_sit = linear_buckets ? siterator() : before_i;
3588
+ for( ; i != end_sit; i = before_i, ++i){
3589
+ const value_type &v = this->priv_value_from_siterator(i);
3002
3590
  const std::size_t hash_value = this->priv_stored_or_compute_hash(v, store_hash_t());
3003
- const size_type new_n = this->priv_hash_to_bucket(hash_value);
3004
- siterator const last = (priv_last_in_group)(i);
3591
+ const std::size_t new_n = this->priv_hash_to_nbucket(hash_value);
3592
+ siterator last = i;
3593
+ (priv_go_to_last_in_group)(last, optimize_multikey_t());
3005
3594
  if(new_n == bucket_to_rehash){
3006
3595
  before_i = last;
3007
3596
  }
3008
3597
  else{
3009
- bucket_type &new_b = buck_ptr[new_n];
3010
- new_b.splice_after(new_b.before_begin(), old_bucket, before_i, last);
3598
+ bucket_type &new_b = this->priv_bucket(new_n);
3599
+ slist_node_algorithms::transfer_after(new_b.get_node_ptr(), before_i.pointed_node(), last.pointed_node());
3011
3600
  }
3012
3601
  }
3013
3602
  rollback.release();
3014
3603
  this->priv_erasure_update_cache();
3015
3604
  }
3016
3605
  }
3017
- else if((ret = split_idx > bucket_cnt/2)){ //!grow
3018
- const size_type target_bucket_num = split_idx - 1 - bucket_cnt/2;
3019
- bucket_type &target_bucket = buck_ptr[target_bucket_num];
3020
- bucket_type &source_bucket = buck_ptr[split_idx-1];
3021
- target_bucket.splice_after(target_bucket.cbefore_begin(), source_bucket);
3022
- this->priv_split_traits().decrement();
3606
+ else if((ret = split_idx > bucket_cnt/2u)){ //!grow
3607
+ const std::size_t target_bucket_num = split_idx - 1u - bucket_cnt/2u;
3608
+ bucket_type &target_bucket = this->priv_bucket(target_bucket_num);
3609
+ bucket_type &source_bucket = this->priv_bucket(split_idx-1u);
3610
+ slist_node_algorithms::transfer_after(target_bucket.get_node_ptr(), source_bucket.get_node_ptr());
3611
+ this->dec_split_count();
3023
3612
  this->priv_insertion_update_cache(target_bucket_num);
3024
3613
  }
3025
3614
  return ret;
@@ -3038,40 +3627,50 @@ class hashtable_impl
3038
3627
  //! <b>Throws</b>: Nothing
3039
3628
  //!
3040
3629
  //! <b>Note</b>: this method is only available if incremental<true> option is activated.
3041
- bool incremental_rehash(const bucket_traits &new_bucket_traits)
3630
+ bool incremental_rehash(const bucket_traits &new_bucket_traits) BOOST_NOEXCEPT
3042
3631
  {
3043
3632
  //This function is only available for containers with incremental hashing
3044
3633
  BOOST_STATIC_ASSERT(( incremental && power_2_buckets ));
3045
- size_type const new_bucket_traits_size = new_bucket_traits.bucket_count();
3046
- size_type const cur_bucket_traits = this->bucket_count();
3634
+ const bucket_ptr new_buckets = new_bucket_traits.bucket_begin();
3635
+ const size_type new_bucket_count_stdszt = static_cast<SizeType>(new_bucket_traits.bucket_count() - bucket_overhead);
3636
+ BOOST_INTRUSIVE_INVARIANT_ASSERT(sizeof(size_type) >= sizeof(std::size_t) || new_bucket_count_stdszt <= size_type(-1));
3637
+ size_type new_bucket_count = static_cast<size_type>(new_bucket_count_stdszt);
3638
+ const size_type old_bucket_count = static_cast<size_type>(this->priv_usable_bucket_count());
3047
3639
  const size_type split_idx = this->split_count();
3048
3640
 
3049
3641
  //Test new bucket size is consistent with internal bucket size and split count
3050
- if(new_bucket_traits_size/2 == cur_bucket_traits){
3051
- if(!(split_idx >= cur_bucket_traits))
3642
+ if(new_bucket_count/2 == old_bucket_count){
3643
+ if(!(split_idx >= old_bucket_count))
3052
3644
  return false;
3053
3645
  }
3054
- else if(new_bucket_traits_size == cur_bucket_traits/2){
3055
- if(!(split_idx <= new_bucket_traits_size))
3646
+ else if(new_bucket_count == old_bucket_count/2){
3647
+ if(!(split_idx <= new_bucket_count))
3056
3648
  return false;
3057
3649
  }
3058
3650
  else{
3059
3651
  return false;
3060
3652
  }
3061
3653
 
3062
- const size_type ini_n = this->priv_get_cache_bucket_num();
3654
+ const size_type ini_n = (size_type)this->priv_get_cache_bucket_num();
3063
3655
  const bucket_ptr old_buckets = this->priv_bucket_pointer();
3064
- this->priv_bucket_traits() = new_bucket_traits;
3065
- if(new_bucket_traits.bucket_begin() != old_buckets){
3656
+
3657
+
3658
+ this->priv_unset_sentinel_bucket();
3659
+ this->priv_initialize_new_buckets(old_buckets, old_bucket_count, new_buckets, new_bucket_count);
3660
+ if (&new_bucket_traits != &this->priv_bucket_traits())
3661
+ this->priv_bucket_traits() = new_bucket_traits;
3662
+
3663
+ if(old_buckets != new_buckets){
3066
3664
  for(size_type n = ini_n; n < split_idx; ++n){
3067
- bucket_type &new_bucket = new_bucket_traits.bucket_begin()[n];
3068
- bucket_type &old_bucket = old_buckets[n];
3069
- new_bucket.splice_after(new_bucket.cbefore_begin(), old_bucket);
3665
+ slist_node_ptr new_bucket_nodeptr = new_bucket_traits.bucket_begin()[difference_type(n)].get_node_ptr();
3666
+ slist_node_ptr old_bucket_node_ptr = old_buckets[difference_type(n)].get_node_ptr();
3667
+ slist_node_algorithms::transfer_after(new_bucket_nodeptr, old_bucket_node_ptr);
3070
3668
  }
3071
- //Put cache to safe position
3072
- this->priv_initialize_cache();
3073
- this->priv_insertion_update_cache(ini_n);
3669
+ //Reset cache to safe position
3670
+ this->priv_set_cache_bucket_num(ini_n);
3074
3671
  }
3672
+
3673
+ this->priv_set_sentinel_bucket();
3075
3674
  return true;
3076
3675
  }
3077
3676
 
@@ -3084,7 +3683,7 @@ class hashtable_impl
3084
3683
  //! <b>Complexity</b>: Constant
3085
3684
  //!
3086
3685
  //! <b>Throws</b>: Nothing
3087
- size_type split_count() const;
3686
+ size_type split_count() const BOOST_NOEXCEPT;
3088
3687
 
3089
3688
  //! <b>Effects</b>: Returns the nearest new bucket count optimized for
3090
3689
  //! the container that is bigger or equal than n. This suggestion can be
@@ -3095,7 +3694,7 @@ class hashtable_impl
3095
3694
  //! <b>Complexity</b>: Amortized constant time.
3096
3695
  //!
3097
3696
  //! <b>Throws</b>: Nothing.
3098
- static size_type suggested_upper_bucket_count(size_type n);
3697
+ static size_type suggested_upper_bucket_count(size_type n) BOOST_NOEXCEPT;
3099
3698
 
3100
3699
  //! <b>Effects</b>: Returns the nearest new bucket count optimized for
3101
3700
  //! the container that is smaller or equal than n. This suggestion can be
@@ -3106,7 +3705,7 @@ class hashtable_impl
3106
3705
  //! <b>Complexity</b>: Amortized constant time.
3107
3706
  //!
3108
3707
  //! <b>Throws</b>: Nothing.
3109
- static size_type suggested_lower_bucket_count(size_type n);
3708
+ static size_type suggested_lower_bucket_count(size_type n) BOOST_NOEXCEPT;
3110
3709
  #endif //#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
3111
3710
 
3112
3711
 
@@ -3116,6 +3715,10 @@ class hashtable_impl
3116
3715
  if(constant_time_size && x.size() != y.size()){
3117
3716
  return false;
3118
3717
  }
3718
+
3719
+ if (boost::intrusive::iterator_udistance(x.begin(), x.end()) != x.size())
3720
+ return false;
3721
+
3119
3722
  for (const_iterator ix = x.cbegin(), ex = x.cend(); ix != ex; ++ix){
3120
3723
  std::pair<const_iterator, const_iterator> eqx(x.equal_range(key_of_value()(*ix))),
3121
3724
  eqy(y.equal_range(key_of_value()(*ix)));
@@ -3148,18 +3751,45 @@ class hashtable_impl
3148
3751
  BOOST_INTRUSIVE_FORCEINLINE void check() const {}
3149
3752
  private:
3150
3753
 
3151
- void rehash_impl(const bucket_traits &new_bucket_traits, bool do_full_rehash)
3754
+ static void priv_initialize_new_buckets
3755
+ ( bucket_ptr old_buckets, size_type old_bucket_count
3756
+ , bucket_ptr new_buckets, size_type new_bucket_count)
3757
+ {
3758
+ //Initialize new buckets
3759
+ const bool same_buffer = old_buckets == new_buckets;
3760
+ if (same_buffer && new_bucket_count <= old_bucket_count) {
3761
+ //Nothing to do here
3762
+ }
3763
+ else {
3764
+ bucket_ptr p;
3765
+ size_type c;
3766
+
3767
+ if (same_buffer) {
3768
+ p = old_buckets + std::ptrdiff_t(old_bucket_count);
3769
+ c = size_type(new_bucket_count - old_bucket_count);
3770
+ }
3771
+ else {
3772
+ p = new_buckets;
3773
+ c = new_bucket_count;
3774
+ }
3775
+ internal_type::priv_init_buckets(p, c);
3776
+ }
3777
+ }
3778
+
3779
+ void priv_rehash_impl(const bucket_traits &new_bucket_traits, bool do_full_rehash)
3152
3780
  {
3781
+ const std::size_t nbc = new_bucket_traits.bucket_count() - bucket_overhead;
3782
+ BOOST_INTRUSIVE_INVARIANT_ASSERT(sizeof(SizeType) >= sizeof(std::size_t) || nbc <= SizeType(-1));
3783
+
3153
3784
  const bucket_ptr new_buckets = new_bucket_traits.bucket_begin();
3154
- size_type new_bucket_count = new_bucket_traits.bucket_count();
3785
+ const size_type new_bucket_count = static_cast<SizeType>(nbc);
3155
3786
  const bucket_ptr old_buckets = this->priv_bucket_pointer();
3156
- size_type old_bucket_count = this->bucket_count();
3787
+ const size_type old_bucket_count = this->bucket_count();
3157
3788
 
3158
3789
  //Check power of two bucket array if the option is activated
3159
3790
  BOOST_INTRUSIVE_INVARIANT_ASSERT
3160
3791
  (!power_2_buckets || (0 == (new_bucket_count & (new_bucket_count-1u))));
3161
3792
 
3162
- size_type n = this->priv_get_cache_bucket_num();
3163
3793
  const bool same_buffer = old_buckets == new_buckets;
3164
3794
  //If the new bucket length is a common factor
3165
3795
  //of the old one we can avoid hash calculations.
@@ -3168,86 +3798,95 @@ class hashtable_impl
3168
3798
  //If we are shrinking the same bucket array and it's
3169
3799
  //is a fast shrink, just rehash the last nodes
3170
3800
  size_type new_first_bucket_num = new_bucket_count;
3171
- if(same_buffer && fast_shrink && (n < new_bucket_count)){
3172
- new_first_bucket_num = n;
3173
- n = new_bucket_count;
3801
+ size_type old_bucket_cache = (size_type)this->priv_get_cache_bucket_num();
3802
+ if(same_buffer && fast_shrink && (old_bucket_cache < new_bucket_count)){
3803
+ new_first_bucket_num = old_bucket_cache;
3804
+ old_bucket_cache = new_bucket_count;
3174
3805
  }
3175
3806
 
3807
+ if (!do_full_rehash)
3808
+ this->priv_initialize_new_buckets(old_buckets, old_bucket_count, new_buckets, new_bucket_count);
3809
+
3176
3810
  //Anti-exception stuff: they destroy the elements if something goes wrong.
3177
3811
  //If the source and destination buckets are the same, the second rollback function
3178
3812
  //is harmless, because all elements have been already unlinked and destroyed
3179
- typedef detail::init_disposer<node_algorithms> NodeDisposer;
3180
- typedef detail::exception_array_disposer<bucket_type, NodeDisposer, size_type> ArrayDisposer;
3181
- NodeDisposer node_disp;
3182
- ArrayDisposer rollback1(new_buckets[0], node_disp, new_bucket_count);
3183
- ArrayDisposer rollback2(old_buckets[0], node_disp, old_bucket_count);
3813
+
3814
+ typedef typename internal_type::template typeof_node_disposer<detail::null_disposer>::type NodeDisposer;
3815
+ typedef exception_bucket_disposer<bucket_type, slist_node_algorithms, NodeDisposer, size_type> ArrayDisposer;
3816
+ NodeDisposer nd(this->make_node_disposer(detail::null_disposer()));
3817
+ ArrayDisposer rollback1(new_buckets[0], nd, new_bucket_count);
3818
+ ArrayDisposer rollback2(old_buckets[0], nd, old_bucket_count);
3184
3819
 
3185
3820
  //Put size in a safe value for rollback exception
3186
- size_type const size_backup = this->priv_size_traits().get_size();
3187
- this->priv_size_traits().set_size(0);
3821
+ size_type const size_backup = this->priv_size_count();
3822
+ this->priv_size_count(0);
3188
3823
  //Put cache to safe position
3189
- this->priv_initialize_cache();
3190
- this->priv_insertion_update_cache(size_type(0u));
3824
+ this->priv_init_cache();
3825
+ this->priv_unset_sentinel_bucket();
3826
+
3827
+ const size_type split = this->rehash_split_from_bucket_count(new_bucket_count);
3191
3828
 
3192
3829
  //Iterate through nodes
3193
- for(; n < old_bucket_count; ++n){
3194
- bucket_type &old_bucket = old_buckets[n];
3830
+ for(size_type n = old_bucket_cache; n < old_bucket_count; ++n){
3831
+ bucket_type &old_bucket = old_buckets[difference_type(n)];
3195
3832
  if(!fast_shrink){
3196
- for( siterator before_i(old_bucket.before_begin()), i(old_bucket.begin()), end_sit(old_bucket.end())
3833
+ siterator before_i(old_bucket.get_node_ptr());
3834
+ siterator i(before_i); ++i;
3835
+ siterator end_sit(this->sit_end(old_bucket));
3836
+ for( //
3197
3837
  ; i != end_sit
3198
3838
  ; i = before_i, ++i){
3199
3839
 
3200
3840
  //First obtain hash value (and store it if do_full_rehash)
3201
3841
  std::size_t hash_value;
3202
3842
  if(do_full_rehash){
3203
- value_type &v = this->priv_value_from_slist_node(i.pointed_node());
3843
+ value_type &v = this->priv_value_from_siterator(i);
3204
3844
  hash_value = this->priv_hasher()(key_of_value()(v));
3205
- node_functions_t::store_hash(pointer_traits<node_ptr>::pointer_to(this->priv_value_to_node(v)), hash_value, store_hash_t());
3845
+ node_functions_t::store_hash(this->priv_value_to_node_ptr(v), hash_value, store_hash_t());
3206
3846
  }
3207
3847
  else{
3208
- const value_type &v = this->priv_value_from_slist_node(i.pointed_node());
3848
+ const value_type &v = this->priv_value_from_siterator(i);
3209
3849
  hash_value = this->priv_stored_or_compute_hash(v, store_hash_t());
3210
3850
  }
3211
3851
 
3212
3852
  //Now calculate the new bucket position
3213
- const size_type new_n = detail::hash_to_bucket_split<power_2_buckets, incremental>
3214
- (hash_value, new_bucket_count, new_bucket_count);
3853
+ const size_type new_n = (size_type)hash_to_bucket_split<power_2_buckets, incremental>
3854
+ (hash_value, new_bucket_count, split, fastmod_buckets_t());
3215
3855
 
3216
3856
  //Update first used bucket cache
3217
3857
  if(cache_begin && new_n < new_first_bucket_num)
3218
3858
  new_first_bucket_num = new_n;
3219
3859
 
3220
3860
  //If the target bucket is new, transfer the whole group
3221
- siterator const last = (priv_last_in_group)(i);
3861
+ siterator last = i;
3862
+ (priv_go_to_last_in_group)(i, optimize_multikey_t());
3222
3863
 
3223
3864
  if(same_buffer && new_n == n){
3224
3865
  before_i = last;
3225
3866
  }
3226
3867
  else{
3227
- bucket_type &new_b = new_buckets[new_n];
3228
- new_b.splice_after(new_b.before_begin(), old_bucket, before_i, last);
3868
+ bucket_type &new_b = new_buckets[difference_type(new_n)];
3869
+ slist_node_algorithms::transfer_after(new_b.get_node_ptr(), before_i.pointed_node(), last.pointed_node());
3229
3870
  }
3230
3871
  }
3231
3872
  }
3232
3873
  else{
3233
- const size_type new_n = detail::hash_to_bucket_split<power_2_buckets, incremental>(n, new_bucket_count, new_bucket_count);
3874
+ const size_type new_n = (size_type)hash_to_bucket_split<power_2_buckets, incremental>
3875
+ (n, new_bucket_count, split, fastmod_buckets_t());
3234
3876
  if(cache_begin && new_n < new_first_bucket_num)
3235
3877
  new_first_bucket_num = new_n;
3236
- bucket_type &new_b = new_buckets[new_n];
3237
- new_b.splice_after( new_b.before_begin()
3238
- , old_bucket
3239
- , old_bucket.before_begin()
3240
- , bucket_plus_vtraits_t::priv_get_last(old_bucket, optimize_multikey_t()));
3878
+ bucket_type &new_b = new_buckets[difference_type(new_n)];
3879
+ siterator last = this->priv_get_last(old_bucket, optimize_multikey_t());
3880
+ slist_node_algorithms::transfer_after(new_b.get_node_ptr(), old_bucket.get_node_ptr(), last.pointed_node());
3241
3881
  }
3242
3882
  }
3243
3883
 
3244
- this->priv_size_traits().set_size(size_backup);
3245
- this->priv_split_traits().set_size(new_bucket_count);
3246
- if(&new_bucket_traits != &this->priv_bucket_traits()){
3884
+ this->priv_size_count(size_backup);
3885
+ this->split_count(split);
3886
+ if(&new_bucket_traits != &this->priv_bucket_traits())
3247
3887
  this->priv_bucket_traits() = new_bucket_traits;
3248
- }
3249
- this->priv_initialize_cache();
3250
- this->priv_insertion_update_cache(new_first_bucket_num);
3888
+ this->priv_set_sentinel_bucket();
3889
+ this->priv_set_cache_bucket_num(new_first_bucket_num);
3251
3890
  rollback1.release();
3252
3891
  rollback2.release();
3253
3892
  }
@@ -3282,8 +3921,8 @@ class hashtable_impl
3282
3921
  for(; b != e; ++b){
3283
3922
  //No need to check for duplicates and insert it in the first position
3284
3923
  //as this is an unordered container. So use minimal insertion code
3285
- std::size_t const hash_to_store = this->priv_stored_or_compute_hash(*b, store_hash_t());;
3286
- size_type const bucket_number = this->priv_hash_to_bucket(hash_to_store);
3924
+ std::size_t const hash_to_store = this->priv_stored_or_compute_hash(*b, store_hash_t());
3925
+ size_type const bucket_number = this->priv_hash_to_nbucket(hash_to_store);
3287
3926
  typedef typename detail::if_c
3288
3927
  <detail::is_const<MaybeConstHashtableImpl>::value, const_reference, reference>::type reference_type;
3289
3928
  reference_type r = *b;
@@ -3301,16 +3940,14 @@ class hashtable_impl
3301
3940
  {
3302
3941
  //No need to check for duplicates and insert it in the first position
3303
3942
  //as this is an unordered container. So use minimal insertion code
3304
- //std::size_t const hash_value = this->priv_stored_or_compute_hash(src_ref, store_hash_t());;
3305
- //size_type const bucket_number = this->priv_hash_to_bucket(hash_value);
3306
- bucket_type &cur_bucket = this->priv_bucket_pointer()[bucket_number];
3307
- siterator const prev(cur_bucket.before_begin());
3943
+ bucket_type &cur_bucket = this->priv_bucket(bucket_number);
3944
+ siterator const prev(cur_bucket.get_node_ptr());
3308
3945
  //Just check if the cloned node is equal to the first inserted value in the new bucket
3309
3946
  //as equal src values were contiguous and they should be already inserted in the
3310
3947
  //destination bucket.
3311
- bool const next_is_in_group = optimize_multikey && !cur_bucket.empty() &&
3948
+ bool const next_is_in_group = optimize_multikey && !this->priv_bucket_empty(bucket_number) &&
3312
3949
  this->priv_equal()( key_of_value()(src_ref)
3313
- , key_of_value()(this->priv_value_from_slist_node((++siterator(prev)).pointed_node())));
3950
+ , key_of_value()(this->priv_value_from_siterator(++siterator(prev))));
3314
3951
  this->priv_insert_equal_after_find(*cloner(src_ref), bucket_number, hash_to_store, prev, next_is_in_group);
3315
3952
  }
3316
3953
 
@@ -3320,108 +3957,122 @@ class hashtable_impl
3320
3957
  //First clone the first ones
3321
3958
  const size_type src_bucket_count = src.bucket_count();
3322
3959
  const size_type dst_bucket_count = this->bucket_count();
3323
- const bucket_ptr src_buckets = src.priv_bucket_pointer();
3324
- const bucket_ptr dst_buckets = this->priv_bucket_pointer();
3325
3960
  size_type constructed = 0;
3326
- typedef node_cast_adaptor< detail::node_disposer<Disposer, value_traits, CircularSListAlgorithms>
3327
- , slist_node_ptr, node_ptr > NodeDisposer;
3961
+ typedef typename internal_type::template typeof_node_disposer<Disposer>::type NodeDisposer;
3328
3962
  NodeDisposer node_disp(disposer, &this->priv_value_traits());
3329
3963
 
3330
- detail::exception_array_disposer<bucket_type, NodeDisposer, size_type>
3331
- rollback(dst_buckets[0], node_disp, constructed);
3964
+ exception_bucket_disposer<bucket_type, slist_node_algorithms, NodeDisposer, size_type>
3965
+ rollback(this->priv_bucket(0), node_disp, constructed);
3332
3966
  //Now insert the remaining ones using the modulo trick
3333
3967
  for( //"constructed" already initialized
3334
3968
  ; constructed < src_bucket_count
3335
3969
  ; ++constructed){
3336
- //Since incremental hashing can't be structurally copied, avoid hash_to_bucket_split
3337
- const std::size_t new_n = detail::hash_to_bucket(constructed, dst_bucket_count, detail::bool_<power_2_buckets>());
3338
- bucket_type &src_b = src_buckets[constructed];
3339
- for( siterator b(src_b.begin()), e(src_b.end()); b != e; ++b){
3340
- slist_node_ptr const n(b.pointed_node());
3970
+
3971
+ const size_type new_n = (size_type)hash_to_bucket_split<power_2_buckets, incremental>
3972
+ (constructed, dst_bucket_count, this->split_count(), fastmod_buckets_t());
3973
+ bucket_type &src_b = src.priv_bucket(constructed);
3974
+ for( siterator b(this->priv_bucket_lbegin(src_b)), e(this->priv_bucket_lend(src_b)); b != e; ++b){
3341
3975
  typedef typename detail::if_c
3342
3976
  <detail::is_const<MaybeConstHashtableImpl>::value, const_reference, reference>::type reference_type;
3343
- reference_type r = this->priv_value_from_slist_node(n);
3977
+ reference_type r = this->priv_value_from_siterator(b);
3344
3978
  this->priv_clone_front_in_bucket<reference_type>
3345
- (new_n, r, this->priv_stored_hash(n, store_hash_t()), cloner);
3979
+ (new_n, r, this->priv_stored_hash(b, store_hash_t()), cloner);
3346
3980
  }
3347
3981
  }
3348
3982
  this->priv_hasher() = src.priv_hasher();
3349
3983
  this->priv_equal() = src.priv_equal();
3350
3984
  rollback.release();
3351
- this->priv_size_traits().set_size(src.priv_size_traits().get_size());
3352
- this->priv_split_traits().set_size(dst_bucket_count);
3353
- this->priv_insertion_update_cache(0u);
3985
+ this->priv_size_count(src.priv_size_count());
3986
+ this->split_count(dst_bucket_count);
3987
+ this->priv_set_cache_bucket_num(0u);
3354
3988
  this->priv_erasure_update_cache();
3355
3989
  }
3356
3990
 
3357
- std::size_t priv_hash_to_bucket(std::size_t hash_value) const
3358
- {
3359
- return detail::hash_to_bucket_split<power_2_buckets, incremental>
3360
- (hash_value, this->priv_bucket_traits().bucket_count(), this->priv_split_traits().get_size());
3361
- }
3362
-
3363
3991
  iterator priv_insert_equal_after_find(reference value, size_type bucket_num, std::size_t hash_value, siterator prev, bool const next_is_in_group)
3364
3992
  {
3365
3993
  //Now store hash if needed
3366
- node_ptr n = pointer_traits<node_ptr>::pointer_to(this->priv_value_to_node(value));
3994
+ node_ptr n = this->priv_value_to_node_ptr(value);
3367
3995
  node_functions_t::store_hash(n, hash_value, store_hash_t());
3368
3996
  //Checks for some modes
3369
- BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!safemode_or_autounlink || node_algorithms::unique(n));
3997
+ BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!safemode_or_autounlink || slist_node_algorithms::unique(n));
3370
3998
  //Shortcut to optimize_multikey cases
3371
3999
  group_functions_t::insert_in_group
3372
- ( next_is_in_group ? detail::dcast_bucket_ptr<node>((++siterator(prev)).pointed_node()) : n
4000
+ ( next_is_in_group ? dcast_bucket_ptr<node>((++siterator(prev)).pointed_node()) : n
3373
4001
  , n, optimize_multikey_t());
3374
4002
  //Update cache and increment size if needed
3375
4003
  this->priv_insertion_update_cache(bucket_num);
3376
- this->priv_size_traits().increment();
3377
- //Insert the element in the bucket after it
3378
- return iterator(bucket_type::s_insert_after(prev, *n), &this->get_bucket_value_traits());
4004
+ this->priv_size_inc();
4005
+ slist_node_algorithms::link_after(prev.pointed_node(), n);
4006
+ return this->build_iterator(siterator(n), this->priv_bucket_ptr(bucket_num));
3379
4007
  }
3380
4008
 
3381
4009
  template<class KeyType, class KeyHasher, class KeyEqual>
3382
- siterator priv_find //In case it is not found previt is bucket.before_begin()
4010
+ siterator priv_find //In case it is not found previt is priv_end_sit()
3383
4011
  ( const KeyType &key, KeyHasher hash_func
3384
4012
  , KeyEqual equal_func, size_type &bucket_number, std::size_t &h, siterator &previt) const
3385
4013
  {
3386
4014
  h = hash_func(key);
3387
- return this->priv_find_with_hash(key, equal_func, bucket_number, h, previt);
3388
- }
3389
4015
 
3390
- template<class KeyType, class KeyEqual>
3391
- bool priv_is_value_equal_to_key(const value_type &v, const std::size_t h, const KeyType &key, KeyEqual equal_func) const
3392
- {
3393
- (void)h;
3394
- return (!compare_hash || this->priv_stored_or_compute_hash(v, store_hash_t()) == h) && equal_func(key, key_of_value()(v));
3395
- }
4016
+ bucket_number = this->priv_hash_to_nbucket(h);
4017
+ bucket_type& b = this->priv_bucket(bucket_number);
4018
+ siterator prev = this->sit_bbegin(b);
4019
+ siterator it = prev;
4020
+ siterator const endit = this->sit_end(b);
3396
4021
 
3397
- //return previous iterator to the next equal range group in case
3398
- static siterator priv_last_in_group(const siterator &it_first_in_group)
3399
- {
3400
- return bucket_type::s_iterator_to
3401
- (*group_functions_t::get_last_in_group
3402
- (detail::dcast_bucket_ptr<node>(it_first_in_group.pointed_node()), optimize_multikey_t()));
4022
+ while (++it != endit) {
4023
+ if (this->priv_is_value_equal_to_key
4024
+ (this->priv_value_from_siterator(it), h, key, equal_func, compare_hash_t())) {
4025
+ previt = prev;
4026
+ return it;
4027
+ }
4028
+ (priv_go_to_last_in_group)(it, optimize_multikey_t());
4029
+ prev = it;
4030
+ }
4031
+ previt = b.get_node_ptr();
4032
+ return this->priv_end_sit();
3403
4033
  }
3404
4034
 
4035
+
3405
4036
  template<class KeyType, class KeyEqual>
3406
- siterator priv_find_with_hash //In case it is not found previt is bucket.before_begin()
3407
- ( const KeyType &key, KeyEqual equal_func, size_type &bucket_number, const std::size_t h, siterator &previt) const
4037
+ siterator priv_find_in_bucket //In case it is not found previt is priv_end_sit()
4038
+ (bucket_type &b, const KeyType& key, KeyEqual equal_func, const std::size_t h) const
3408
4039
  {
3409
- bucket_number = this->priv_hash_to_bucket(h);
3410
- bucket_type &b = this->priv_bucket_pointer()[bucket_number];
3411
- previt = b.before_begin();
3412
- siterator it = previt;
3413
- siterator const endit = b.end();
4040
+ siterator it(this->sit_begin(b));
4041
+ siterator const endit(this->sit_end(b));
3414
4042
 
3415
- while(++it != endit){
3416
- if(this->priv_is_value_equal_to_key(this->priv_value_from_slist_node(it.pointed_node()), h, key, equal_func)){
4043
+ for (; it != endit; (priv_go_to_last_in_group)(it, optimize_multikey_t()), ++it) {
4044
+ if (BOOST_LIKELY(this->priv_is_value_equal_to_key
4045
+ (this->priv_value_from_siterator(it), h, key, equal_func, compare_hash_t()))) {
3417
4046
  return it;
3418
4047
  }
3419
- previt = it = (priv_last_in_group)(it);
3420
4048
  }
3421
- previt = b.before_begin();
3422
- return this->priv_invalid_local_it();
4049
+ return this->priv_end_sit();
4050
+ }
4051
+
4052
+ template<class KeyType, class KeyEqual>
4053
+ BOOST_INTRUSIVE_FORCEINLINE bool priv_is_value_equal_to_key
4054
+ (const value_type &v, const std::size_t h, const KeyType &key, KeyEqual equal_func, detail::true_) const //compare_hash
4055
+ { return this->priv_stored_or_compute_hash(v, store_hash_t()) == h && equal_func(key, key_of_value()(v)); }
4056
+
4057
+ template<class KeyType, class KeyEqual>
4058
+ BOOST_INTRUSIVE_FORCEINLINE bool priv_is_value_equal_to_key
4059
+ (const value_type& v, const std::size_t , const KeyType& key, KeyEqual equal_func, detail::false_) const //compare_hash
4060
+ { return equal_func(key, key_of_value()(v)); }
4061
+
4062
+ //return previous iterator to the next equal range group in case
4063
+ BOOST_INTRUSIVE_FORCEINLINE static void priv_go_to_last_in_group
4064
+ (siterator &it_first_in_group, detail::true_) BOOST_NOEXCEPT //optimize_multikey
4065
+ {
4066
+ it_first_in_group =
4067
+ (group_functions_t::get_last_in_group
4068
+ (dcast_bucket_ptr<node>(it_first_in_group.pointed_node()), optimize_multikey_t()));
3423
4069
  }
3424
4070
 
4071
+ //return previous iterator to the next equal range group in case
4072
+ BOOST_INTRUSIVE_FORCEINLINE static void priv_go_to_last_in_group //!optimize_multikey
4073
+ (siterator /*&it_first_in_group*/, detail::false_) BOOST_NOEXCEPT
4074
+ { }
4075
+
3425
4076
  template<class KeyType, class KeyHasher, class KeyEqual>
3426
4077
  std::pair<siterator, siterator> priv_local_equal_range
3427
4078
  ( const KeyType &key
@@ -3430,7 +4081,7 @@ class hashtable_impl
3430
4081
  , size_type &found_bucket
3431
4082
  , size_type &cnt) const
3432
4083
  {
3433
- size_type internal_cnt = 0;
4084
+ std::size_t internal_cnt = 0;
3434
4085
  //Let's see if the element is present
3435
4086
 
3436
4087
  siterator prev;
@@ -3438,34 +4089,47 @@ class hashtable_impl
3438
4089
  std::size_t h;
3439
4090
  std::pair<siterator, siterator> to_return
3440
4091
  ( this->priv_find(key, hash_func, equal_func, n_bucket, h, prev)
3441
- , this->priv_invalid_local_it());
4092
+ , this->priv_end_sit());
3442
4093
 
3443
4094
  if(to_return.first != to_return.second){
3444
4095
  found_bucket = n_bucket;
3445
4096
  //If it's present, find the first that it's not equal in
3446
4097
  //the same bucket
3447
- bucket_type &b = this->priv_bucket_pointer()[n_bucket];
3448
4098
  siterator it = to_return.first;
3449
- ++internal_cnt; //At least one is found
3450
- if(optimize_multikey){
3451
- to_return.second = ++(priv_last_in_group)(it);
3452
- internal_cnt += boost::intrusive::iterator_distance(++it, to_return.second);
4099
+ siterator const bend = this->priv_bucket_lend(n_bucket);
4100
+ BOOST_IF_CONSTEXPR(optimize_multikey){
4101
+ siterator past_last_in_group_it = it;
4102
+ (priv_go_to_last_in_group)(past_last_in_group_it, optimize_multikey_t());
4103
+ ++past_last_in_group_it;
4104
+ internal_cnt += boost::intrusive::iterator_udistance(++it, past_last_in_group_it) + 1u;
4105
+ if (past_last_in_group_it != bend)
4106
+ to_return.second = past_last_in_group_it;
3453
4107
  }
3454
4108
  else{
3455
- siterator const bend = b.end();
3456
- while(++it != bend &&
3457
- this->priv_is_value_equal_to_key(this->priv_value_from_slist_node(it.pointed_node()), h, key, equal_func)){
3458
- ++internal_cnt;
3459
- }
3460
- to_return.second = it;
4109
+ do {
4110
+ ++internal_cnt; //At least one is found
4111
+ ++it;
4112
+ } while(it != bend &&
4113
+ this->priv_is_value_equal_to_key
4114
+ (this->priv_value_from_siterator(it), h, key, equal_func, compare_hash_t()));
4115
+ if (it != bend)
4116
+ to_return.second = it;
3461
4117
  }
3462
4118
  }
3463
- cnt = internal_cnt;
4119
+ cnt = size_type(internal_cnt);
3464
4120
  return to_return;
3465
4121
  }
3466
4122
 
4123
+ struct priv_equal_range_result
4124
+ {
4125
+ siterator first;
4126
+ siterator second;
4127
+ bucket_ptr bucket_first;
4128
+ bucket_ptr bucket_second;
4129
+ };
4130
+
3467
4131
  template<class KeyType, class KeyHasher, class KeyEqual>
3468
- std::pair<siterator, siterator> priv_equal_range
4132
+ priv_equal_range_result priv_equal_range
3469
4133
  ( const KeyType &key
3470
4134
  , KeyHasher hash_func
3471
4135
  , KeyEqual equal_func) const
@@ -3474,71 +4138,103 @@ class hashtable_impl
3474
4138
  size_type cnt;
3475
4139
 
3476
4140
  //Let's see if the element is present
3477
- std::pair<siterator, siterator> to_return
4141
+ const std::pair<siterator, siterator> to_return
3478
4142
  (this->priv_local_equal_range(key, hash_func, equal_func, n_bucket, cnt));
4143
+ priv_equal_range_result r;
4144
+ r.first = to_return.first;
4145
+ r.second = to_return.second;
4146
+
3479
4147
  //If not, find the next element as ".second" if ".second" local iterator
3480
4148
  //is not pointing to an element.
3481
- bucket_ptr const bp = this->priv_bucket_pointer();
3482
- if(to_return.first != to_return.second &&
3483
- to_return.second == bp[n_bucket].end()){
3484
- to_return.second = this->priv_invalid_local_it();
3485
- ++n_bucket;
3486
- for( const size_type max_bucket = this->bucket_count()
3487
- ; n_bucket != max_bucket
3488
- ; ++n_bucket){
3489
- bucket_type &b = bp[n_bucket];
3490
- if(!b.empty()){
3491
- to_return.second = b.begin();
3492
- break;
3493
- }
4149
+ if(to_return.first == to_return.second) {
4150
+ r.bucket_first = r.bucket_second = this->priv_invalid_bucket_ptr();
4151
+ }
4152
+ else if (to_return.second != this->priv_end_sit()) {
4153
+ r.bucket_first = this->priv_bucket_ptr(n_bucket);
4154
+ }
4155
+ else{
4156
+ r.bucket_first = this->priv_bucket_ptr(n_bucket);
4157
+ const size_type max_bucket = this->bucket_count();
4158
+ do{
4159
+ ++n_bucket;
4160
+ } while (n_bucket != max_bucket && this->priv_bucket_empty(n_bucket));
4161
+
4162
+ if (n_bucket == max_bucket){
4163
+ r.bucket_second = this->priv_invalid_bucket_ptr();
4164
+ }
4165
+ else{
4166
+ r.bucket_second = this->priv_bucket_ptr(n_bucket);
4167
+ r.second = siterator(r.bucket_second->begin_ptr());
3494
4168
  }
3495
4169
  }
3496
- return to_return;
4170
+
4171
+ return r;
3497
4172
  }
3498
4173
 
3499
- std::size_t priv_get_bucket_num(siterator it)
3500
- { return this->priv_get_bucket_num_hash_dispatch(it, store_hash_t()); }
4174
+ BOOST_INTRUSIVE_FORCEINLINE size_type priv_get_bucket_num(const_iterator it) BOOST_NOEXCEPT
4175
+ { return this->priv_get_bucket_num(it, linear_buckets_t()); }
4176
+
4177
+ BOOST_INTRUSIVE_FORCEINLINE size_type priv_get_bucket_num(const_iterator it, detail::true_) BOOST_NOEXCEPT //linear
4178
+ { return size_type(it.get_bucket_ptr() - this->priv_bucket_pointer()); }
4179
+
4180
+ BOOST_INTRUSIVE_FORCEINLINE size_type priv_get_bucket_num(const_iterator it, detail::false_) BOOST_NOEXCEPT //!linear
4181
+ { return this->priv_get_bucket_num_hash_dispatch(it.slist_it(), store_hash_t()); }
4182
+
4183
+ BOOST_INTRUSIVE_FORCEINLINE size_type priv_get_bucket_num_hash_dispatch(siterator it, detail::true_) BOOST_NOEXCEPT //store_hash
4184
+ { return (size_type)this->priv_hash_to_nbucket(this->priv_stored_hash(it, store_hash_t())); }
3501
4185
 
3502
- std::size_t priv_get_bucket_num_hash_dispatch(siterator it, detail::true_) //store_hash
4186
+ size_type priv_get_bucket_num_hash_dispatch(siterator it, detail::false_) BOOST_NOEXCEPT //NO store_hash
3503
4187
  {
3504
- return this->priv_hash_to_bucket
3505
- (this->priv_stored_hash(it.pointed_node(), store_hash_t()));
4188
+ const bucket_type &f = this->priv_bucket(0u);
4189
+ slist_node_ptr bb = group_functions_t::get_bucket_before_begin
4190
+ ( this->priv_bucket_lbbegin(0u).pointed_node()
4191
+ , this->priv_bucket_lbbegin(this->priv_usable_bucket_count() - 1u).pointed_node()
4192
+ , it.pointed_node()
4193
+ , optimize_multikey_t());
4194
+
4195
+ //Now get the bucket_impl from the iterator
4196
+ const bucket_type &b = static_cast<const bucket_type&>(*bb);
4197
+ //Now just calculate the index b has in the bucket array
4198
+ return static_cast<size_type>(&b - &f);
3506
4199
  }
3507
4200
 
3508
- std::size_t priv_get_bucket_num_hash_dispatch(siterator it, detail::false_) //NO store_hash
3509
- { return this->priv_get_bucket_num_no_hash_store(it, optimize_multikey_t()); }
3510
4201
 
3511
- static siterator priv_get_previous(bucket_type &b, siterator i)
3512
- { return bucket_plus_vtraits_t::priv_get_previous(b, i, optimize_multikey_t()); }
4202
+ BOOST_INTRUSIVE_FORCEINLINE bucket_ptr priv_get_bucket_ptr(const_iterator it) BOOST_NOEXCEPT
4203
+ { return this->priv_get_bucket_ptr(it, linear_buckets_t()); }
4204
+
4205
+ BOOST_INTRUSIVE_FORCEINLINE bucket_ptr priv_get_bucket_ptr(const_iterator it, detail::true_) BOOST_NOEXCEPT //linear
4206
+ { return it.get_bucket_ptr(); }
4207
+
4208
+ BOOST_INTRUSIVE_FORCEINLINE bucket_ptr priv_get_bucket_ptr(const_iterator it, detail::false_) BOOST_NOEXCEPT //!linear
4209
+ { return this->priv_bucket_ptr(this->priv_get_bucket_num_hash_dispatch(it.slist_it(), store_hash_t())); }
3513
4210
 
3514
4211
  /// @endcond
3515
4212
  };
3516
4213
 
3517
4214
  /// @cond
3518
4215
  template < class T
3519
- , bool UniqueKeys
3520
4216
  , class PackedOptions
3521
4217
  >
3522
4218
  struct make_bucket_traits
3523
4219
  {
3524
4220
  //Real value traits must be calculated from options
3525
4221
  typedef typename detail::get_value_traits
3526
- <T, typename PackedOptions::proto_value_traits>::type value_traits;
4222
+ <T, typename PackedOptions::proto_value_traits>::type value_traits;
3527
4223
 
3528
4224
  typedef typename PackedOptions::bucket_traits specified_bucket_traits;
3529
4225
 
3530
4226
  //Real bucket traits must be calculated from options and calculated value_traits
3531
- typedef typename get_slist_impl
3532
- <typename reduced_slist_node_traits
3533
- <typename value_traits::node_traits>::type
3534
- >::type slist_impl;
4227
+ typedef bucket_traits_impl
4228
+ < typename unordered_bucket_ptr_impl
4229
+ <value_traits>::type
4230
+ , std::size_t> bucket_traits_t;
3535
4231
 
3536
4232
  typedef typename
3537
4233
  detail::if_c< detail::is_same
3538
4234
  < specified_bucket_traits
3539
4235
  , default_bucket_traits
3540
4236
  >::value
3541
- , bucket_traits_impl<slist_impl>
4237
+ , bucket_traits_t
3542
4238
  , specified_bucket_traits
3543
4239
  >::type type;
3544
4240
  };
@@ -3554,6 +4250,7 @@ template<class T, class O1 = void, class O2 = void
3554
4250
  , class O5 = void, class O6 = void
3555
4251
  , class O7 = void, class O8 = void
3556
4252
  , class O9 = void, class O10= void
4253
+ , class O11= void
3557
4254
  >
3558
4255
  #endif
3559
4256
  struct make_hashtable
@@ -3562,7 +4259,7 @@ struct make_hashtable
3562
4259
  typedef typename pack_options
3563
4260
  < hashtable_defaults,
3564
4261
  #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
3565
- O1, O2, O3, O4, O5, O6, O7, O8, O9, O10
4262
+ O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11
3566
4263
  #else
3567
4264
  Options...
3568
4265
  #endif
@@ -3572,7 +4269,7 @@ struct make_hashtable
3572
4269
  <T, typename packed_options::proto_value_traits>::type value_traits;
3573
4270
 
3574
4271
  typedef typename make_bucket_traits
3575
- <T, false, packed_options>::type bucket_traits;
4272
+ <T, packed_options>::type bucket_traits;
3576
4273
 
3577
4274
  typedef hashtable_impl
3578
4275
  < value_traits
@@ -3587,6 +4284,8 @@ struct make_hashtable
3587
4284
  |(std::size_t(packed_options::cache_begin)*hash_bool_flags::cache_begin_pos)
3588
4285
  |(std::size_t(packed_options::compare_hash)*hash_bool_flags::compare_hash_pos)
3589
4286
  |(std::size_t(packed_options::incremental)*hash_bool_flags::incremental_pos)
4287
+ |(std::size_t(packed_options::linear_buckets)*hash_bool_flags::linear_buckets_pos)
4288
+ |(std::size_t(packed_options::fastmod_buckets)*hash_bool_flags::fastmod_buckets_pos)
3590
4289
  > implementation_defined;
3591
4290
 
3592
4291
  /// @endcond