passenger 6.0.19 → 6.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1293) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +65 -3
  3. data/CONTRIBUTORS +2 -0
  4. data/README.md +2 -2
  5. data/bin/passenger-install-nginx-module +4 -4
  6. data/build/integration_tests.rb +2 -1
  7. data/build/support/cxx_dependency_map.rb +155 -54
  8. data/dev/copy_boost_headers +21 -7
  9. data/dev/nginx_version_sha256 +72 -0
  10. data/package.json +15 -15
  11. data/src/agent/AgentMain.cpp +2 -8
  12. data/src/agent/Core/AdminPanelConnector.h +2 -3
  13. data/src/agent/Core/ApiServer.h +1 -1
  14. data/src/agent/Core/ApplicationPool/Pool/StateInspection.cpp +8 -1
  15. data/src/agent/Core/Config.h +6 -3
  16. data/src/agent/Core/Controller/AppResponse.h +0 -1
  17. data/src/agent/Core/Controller/Config.h +2 -2
  18. data/src/agent/Core/Controller/SendRequest.cpp +2 -2
  19. data/src/agent/Core/CoreMain.cpp +1 -0
  20. data/src/agent/Core/ResponseCache.h +3 -2
  21. data/src/agent/Core/SecurityUpdateChecker.h +1 -1
  22. data/src/agent/Core/SpawningKit/Handshake/Perform.h +4 -4
  23. data/src/agent/Core/SpawningKit/UserSwitchingRules.h +2 -2
  24. data/src/agent/ExecHelper/ExecHelperMain.cpp +10 -12
  25. data/src/agent/FileReadHelper/FileReadHelperMain.cpp +7 -10
  26. data/src/agent/MainFunctions.h +38 -0
  27. data/src/agent/Shared/ApiServerUtils.h +3 -2
  28. data/src/agent/Shared/Fundamentals/Initialization.cpp +1 -1
  29. data/src/agent/SpawnEnvSetupper/SpawnEnvSetupperMain.cpp +2 -3
  30. data/src/agent/SystemMetrics/SystemMetricsMain.cpp +1 -0
  31. data/src/agent/TempDirToucher/TempDirToucherMain.cpp +6 -4
  32. data/src/agent/Watchdog/ApiServer.h +1 -1
  33. data/src/agent/Watchdog/Config.h +1 -1
  34. data/src/agent/Watchdog/WatchdogMain.cpp +5 -12
  35. data/src/apache2_module/Hooks.cpp +26 -1
  36. data/src/cxx_supportlib/ConfigKit/Common.h +1 -1
  37. data/src/cxx_supportlib/Constants.h +1 -1
  38. data/src/cxx_supportlib/DataStructures/StringKeyTable.h +1 -1
  39. data/src/cxx_supportlib/FileTools/PathManip.cpp +10 -1
  40. data/src/cxx_supportlib/IOTools/IOUtils.cpp +2 -6
  41. data/src/cxx_supportlib/Integrations/LibevJsonUtils.h +3 -3
  42. data/src/cxx_supportlib/JsonTools/CBindings.cpp +0 -2
  43. data/src/cxx_supportlib/JsonTools/JsonUtils.h +4 -4
  44. data/src/cxx_supportlib/LoggingKit/Context.h +16 -21
  45. data/src/cxx_supportlib/LoggingKit/Forward.h +0 -2
  46. data/src/cxx_supportlib/LoggingKit/Implementation.cpp +36 -72
  47. data/src/cxx_supportlib/MemoryKit/mbuf.cpp +12 -4
  48. data/src/cxx_supportlib/MemoryKit/mbuf.h +1 -1
  49. data/src/cxx_supportlib/ProcessManagement/Utils.cpp +1 -1
  50. data/src/cxx_supportlib/ResourceLocator.h +1 -1
  51. data/src/cxx_supportlib/SecurityKit/Crypto.cpp +3 -94
  52. data/src/cxx_supportlib/SecurityKit/Crypto.h +0 -8
  53. data/src/cxx_supportlib/ServerKit/Context.h +6 -0
  54. data/src/cxx_supportlib/ServerKit/Errors.h +3 -2
  55. data/src/cxx_supportlib/ServerKit/HttpHeaderParser.h +99 -64
  56. data/src/cxx_supportlib/ServerKit/HttpHeaderParserState.h +4 -1
  57. data/src/cxx_supportlib/ServerKit/HttpRequest.h +2 -2
  58. data/src/cxx_supportlib/ServerKit/HttpServer.h +3 -2
  59. data/src/cxx_supportlib/ServerKit/llerrors.h +84 -0
  60. data/src/cxx_supportlib/ServerKit/llhttp.c +10168 -0
  61. data/src/cxx_supportlib/ServerKit/llhttp.h +903 -0
  62. data/src/cxx_supportlib/ServerKit/llhttp_api.c +510 -0
  63. data/src/cxx_supportlib/ServerKit/llhttp_http.c +170 -0
  64. data/src/cxx_supportlib/ServerKit/llversion.h +12 -0
  65. data/src/cxx_supportlib/ServerKit/url_parser.c +574 -0
  66. data/src/cxx_supportlib/ServerKit/url_parser.h +74 -0
  67. data/src/cxx_supportlib/StaticString.h +3 -1
  68. data/src/cxx_supportlib/StrIntTools/DateParsing.h +1 -1
  69. data/src/cxx_supportlib/StrIntTools/StrIntUtils.cpp +12 -3
  70. data/src/cxx_supportlib/StrIntTools/StrIntUtils.h +5 -0
  71. data/src/cxx_supportlib/SystemTools/SystemMetricsCollector.h +2 -2
  72. data/src/cxx_supportlib/SystemTools/UserDatabase.cpp +14 -14
  73. data/src/cxx_supportlib/SystemTools/UserDatabase.h +6 -10
  74. data/src/cxx_supportlib/Utils/AnsiColorConstants.h +11 -9
  75. data/src/cxx_supportlib/Utils.cpp +1 -1
  76. data/src/cxx_supportlib/oxt/implementation.cpp +1 -2
  77. data/src/cxx_supportlib/oxt/system_calls.cpp +1 -1
  78. data/src/cxx_supportlib/vendor-modified/boost/asio/any_completion_executor.hpp +26 -32
  79. data/src/cxx_supportlib/vendor-modified/boost/asio/any_completion_handler.hpp +194 -56
  80. data/src/cxx_supportlib/vendor-modified/boost/asio/any_io_executor.hpp +34 -42
  81. data/src/cxx_supportlib/vendor-modified/boost/asio/append.hpp +10 -23
  82. data/src/cxx_supportlib/vendor-modified/boost/asio/as_tuple.hpp +21 -34
  83. data/src/cxx_supportlib/vendor-modified/boost/asio/associated_allocator.hpp +26 -45
  84. data/src/cxx_supportlib/vendor-modified/boost/asio/associated_cancellation_slot.hpp +26 -43
  85. data/src/cxx_supportlib/vendor-modified/boost/asio/associated_executor.hpp +30 -52
  86. data/src/cxx_supportlib/vendor-modified/boost/asio/associated_immediate_executor.hpp +282 -0
  87. data/src/cxx_supportlib/vendor-modified/boost/asio/associator.hpp +1 -1
  88. data/src/cxx_supportlib/vendor-modified/boost/asio/async_result.hpp +178 -863
  89. data/src/cxx_supportlib/vendor-modified/boost/asio/awaitable.hpp +1 -1
  90. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_datagram_socket.hpp +64 -98
  91. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_deadline_timer.hpp +17 -22
  92. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_file.hpp +18 -23
  93. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_io_object.hpp +4 -8
  94. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_random_access_file.hpp +30 -42
  95. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_raw_socket.hpp +65 -96
  96. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_readable_pipe.hpp +20 -29
  97. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_seq_packet_socket.hpp +36 -48
  98. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_serial_port.hpp +31 -44
  99. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_signal_set.hpp +73 -23
  100. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket.hpp +34 -45
  101. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket_acceptor.hpp +108 -151
  102. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket_iostream.hpp +6 -82
  103. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket_streambuf.hpp +6 -51
  104. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_stream_file.hpp +30 -40
  105. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_stream_socket.hpp +50 -76
  106. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_streambuf.hpp +13 -15
  107. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_streambuf_fwd.hpp +3 -3
  108. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_waitable_timer.hpp +23 -32
  109. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_writable_pipe.hpp +20 -29
  110. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_allocator.hpp +97 -299
  111. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_cancellation_slot.hpp +97 -288
  112. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_executor.hpp +90 -288
  113. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_immediate_executor.hpp +551 -0
  114. data/src/cxx_supportlib/vendor-modified/boost/asio/buffer.hpp +365 -290
  115. data/src/cxx_supportlib/vendor-modified/boost/asio/buffer_registration.hpp +29 -39
  116. data/src/cxx_supportlib/vendor-modified/boost/asio/buffered_read_stream.hpp +27 -39
  117. data/src/cxx_supportlib/vendor-modified/boost/asio/buffered_read_stream_fwd.hpp +1 -1
  118. data/src/cxx_supportlib/vendor-modified/boost/asio/buffered_stream.hpp +33 -49
  119. data/src/cxx_supportlib/vendor-modified/boost/asio/buffered_stream_fwd.hpp +1 -1
  120. data/src/cxx_supportlib/vendor-modified/boost/asio/buffered_write_stream.hpp +27 -39
  121. data/src/cxx_supportlib/vendor-modified/boost/asio/buffered_write_stream_fwd.hpp +1 -1
  122. data/src/cxx_supportlib/vendor-modified/boost/asio/buffers_iterator.hpp +4 -4
  123. data/src/cxx_supportlib/vendor-modified/boost/asio/cancellation_signal.hpp +25 -85
  124. data/src/cxx_supportlib/vendor-modified/boost/asio/cancellation_state.hpp +16 -16
  125. data/src/cxx_supportlib/vendor-modified/boost/asio/cancellation_type.hpp +8 -25
  126. data/src/cxx_supportlib/vendor-modified/boost/asio/co_spawn.hpp +17 -17
  127. data/src/cxx_supportlib/vendor-modified/boost/asio/completion_condition.hpp +1 -1
  128. data/src/cxx_supportlib/vendor-modified/boost/asio/compose.hpp +60 -272
  129. data/src/cxx_supportlib/vendor-modified/boost/asio/connect.hpp +52 -79
  130. data/src/cxx_supportlib/vendor-modified/boost/asio/connect_pipe.hpp +1 -1
  131. data/src/cxx_supportlib/vendor-modified/boost/asio/consign.hpp +11 -24
  132. data/src/cxx_supportlib/vendor-modified/boost/asio/coroutine.hpp +2 -1
  133. data/src/cxx_supportlib/vendor-modified/boost/asio/deadline_timer.hpp +1 -1
  134. data/src/cxx_supportlib/vendor-modified/boost/asio/defer.hpp +37 -34
  135. data/src/cxx_supportlib/vendor-modified/boost/asio/deferred.hpp +302 -262
  136. data/src/cxx_supportlib/vendor-modified/boost/asio/detached.hpp +12 -20
  137. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/array.hpp +2 -10
  138. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/array_fwd.hpp +2 -4
  139. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/assert.hpp +1 -1
  140. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/atomic_count.hpp +5 -13
  141. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/base_from_cancellation_state.hpp +21 -20
  142. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/base_from_completion_cond.hpp +2 -2
  143. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/bind_handler.hpp +129 -563
  144. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/blocking_executor_op.hpp +3 -3
  145. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/buffer_resize_guard.hpp +1 -1
  146. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/buffer_sequence_adapter.hpp +3 -7
  147. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/buffered_stream_storage.hpp +1 -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 +2 -23
  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 +4 -4
  152. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/composed_work.hpp +21 -97
  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 +155 -963
  157. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/consuming_buffers.hpp +3 -11
  158. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/cstddef.hpp +1 -5
  159. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/cstdint.hpp +2 -24
  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 +4 -4
  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 +1 -1
  164. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/descriptor_read_op.hpp +41 -3
  165. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/descriptor_write_op.hpp +40 -3
  166. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/dev_poll_reactor.hpp +20 -3
  167. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/epoll_reactor.hpp +20 -3
  168. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/event.hpp +3 -5
  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 +2 -13
  171. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/executor_function.hpp +8 -60
  172. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/executor_op.hpp +6 -6
  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 +3 -43
  175. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/functional.hpp +1 -12
  176. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/future.hpp +9 -10
  177. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/global.hpp +3 -5
  178. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_alloc_helpers.hpp +41 -104
  179. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_cont_helpers.hpp +1 -1
  180. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_tracking.hpp +3 -3
  181. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_type_requirements.hpp +9 -15
  182. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_work.hpp +101 -123
  183. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/hash_map.hpp +1 -1
  184. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/buffer_sequence_adapter.ipp +1 -1
  185. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/descriptor_ops.ipp +36 -15
  186. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/dev_poll_reactor.hpp +2 -2
  187. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/dev_poll_reactor.ipp +13 -4
  188. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/epoll_reactor.hpp +2 -2
  189. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/epoll_reactor.ipp +17 -8
  190. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/eventfd_select_interrupter.ipp +1 -1
  191. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/handler_tracking.ipp +5 -5
  192. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/io_uring_descriptor_service.ipp +2 -2
  193. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/io_uring_file_service.ipp +1 -1
  194. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/io_uring_service.hpp +1 -1
  195. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/io_uring_service.ipp +69 -35
  196. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/io_uring_socket_service_base.ipp +2 -2
  197. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/kqueue_reactor.hpp +2 -2
  198. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/kqueue_reactor.ipp +15 -6
  199. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/null_event.ipp +1 -1
  200. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/pipe_select_interrupter.ipp +1 -1
  201. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/posix_event.ipp +1 -1
  202. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/posix_mutex.ipp +1 -1
  203. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/posix_serial_port_service.ipp +1 -1
  204. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/posix_thread.ipp +1 -1
  205. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/posix_tss_ptr.ipp +1 -1
  206. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/reactive_descriptor_service.ipp +9 -9
  207. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/reactive_socket_service_base.ipp +26 -18
  208. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/resolver_service_base.ipp +3 -3
  209. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/scheduler.ipp +2 -1
  210. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/select_reactor.hpp +2 -2
  211. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/select_reactor.ipp +12 -4
  212. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/service_registry.hpp +2 -3
  213. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/service_registry.ipp +1 -1
  214. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/signal_set_service.ipp +57 -4
  215. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_ops.ipp +63 -5
  216. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_select_interrupter.ipp +1 -1
  217. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/strand_executor_service.hpp +47 -68
  218. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/strand_executor_service.ipp +1 -1
  219. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/strand_service.hpp +2 -3
  220. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/strand_service.ipp +1 -1
  221. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/thread_context.ipp +1 -1
  222. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/throw_error.ipp +1 -1
  223. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/timer_queue_ptime.ipp +12 -12
  224. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/timer_queue_set.ipp +1 -1
  225. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/initiate_defer.hpp +209 -0
  226. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/initiate_dispatch.hpp +195 -0
  227. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/initiate_post.hpp +209 -0
  228. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_control.hpp +1 -1
  229. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_object_impl.hpp +6 -10
  230. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_descriptor_read_at_op.hpp +6 -3
  231. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_descriptor_read_op.hpp +6 -3
  232. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_descriptor_service.hpp +17 -9
  233. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_descriptor_write_at_op.hpp +6 -3
  234. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_descriptor_write_op.hpp +6 -3
  235. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_file_service.hpp +2 -3
  236. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_null_buffers_op.hpp +5 -4
  237. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_operation.hpp +1 -1
  238. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_service.hpp +4 -3
  239. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_accept_op.hpp +11 -12
  240. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_connect_op.hpp +5 -4
  241. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_recv_op.hpp +6 -3
  242. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_recvfrom_op.hpp +7 -4
  243. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_recvmsg_op.hpp +6 -3
  244. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_send_op.hpp +6 -3
  245. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_sendto_op.hpp +6 -3
  246. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_service.hpp +11 -13
  247. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_service_base.hpp +9 -9
  248. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_wait_op.hpp +5 -4
  249. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/is_buffer_sequence.hpp +7 -49
  250. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/is_executor.hpp +1 -1
  251. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/keyword_tss_ptr.hpp +1 -1
  252. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/kqueue_reactor.hpp +20 -3
  253. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/limits.hpp +1 -6
  254. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/local_free_on_block_exit.hpp +1 -1
  255. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/memory.hpp +13 -43
  256. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/mutex.hpp +3 -5
  257. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/non_const_lvalue.hpp +4 -15
  258. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/noncopyable.hpp +1 -1
  259. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_event.hpp +1 -1
  260. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_fenced_block.hpp +1 -1
  261. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_global.hpp +1 -1
  262. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_mutex.hpp +1 -1
  263. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_reactor.hpp +1 -1
  264. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_signal_blocker.hpp +1 -1
  265. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_socket_service.hpp +3 -3
  266. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_static_mutex.hpp +1 -1
  267. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_thread.hpp +1 -1
  268. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_tss_ptr.hpp +1 -1
  269. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/object_pool.hpp +1 -1
  270. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/op_queue.hpp +1 -1
  271. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/operation.hpp +1 -1
  272. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/pipe_select_interrupter.hpp +1 -1
  273. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/pop_options.hpp +1 -1
  274. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_event.hpp +1 -1
  275. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_fd_set_adapter.hpp +1 -1
  276. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_global.hpp +1 -1
  277. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_mutex.hpp +1 -1
  278. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_serial_port_service.hpp +1 -1
  279. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_signal_blocker.hpp +1 -1
  280. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_static_mutex.hpp +1 -1
  281. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_thread.hpp +1 -1
  282. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_tss_ptr.hpp +1 -1
  283. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/push_options.hpp +1 -1
  284. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_descriptor_service.hpp +61 -25
  285. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_null_buffers_op.hpp +37 -4
  286. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_accept_op.hpp +89 -12
  287. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_connect_op.hpp +41 -4
  288. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_recv_op.hpp +40 -4
  289. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_recvfrom_op.hpp +41 -4
  290. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_recvmsg_op.hpp +41 -4
  291. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_send_op.hpp +41 -4
  292. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_sendto_op.hpp +40 -4
  293. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_service.hpp +20 -20
  294. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_service_base.hpp +135 -38
  295. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_wait_op.hpp +37 -4
  296. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactor.hpp +1 -1
  297. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactor_op.hpp +1 -1
  298. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactor_op_queue.hpp +1 -1
  299. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/recycling_allocator.hpp +2 -2
  300. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/regex_fwd.hpp +4 -13
  301. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_endpoint_op.hpp +4 -4
  302. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_op.hpp +1 -1
  303. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_query_op.hpp +4 -4
  304. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolver_service.hpp +3 -3
  305. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolver_service_base.hpp +1 -1
  306. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/scheduler.hpp +1 -1
  307. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/scheduler_operation.hpp +1 -1
  308. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/scheduler_task.hpp +1 -1
  309. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/scheduler_thread_info.hpp +1 -1
  310. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/scoped_lock.hpp +1 -1
  311. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/scoped_ptr.hpp +1 -1
  312. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/select_interrupter.hpp +1 -1
  313. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/select_reactor.hpp +20 -3
  314. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/service_registry.hpp +2 -3
  315. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/signal_blocker.hpp +1 -1
  316. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/signal_handler.hpp +3 -3
  317. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/signal_init.hpp +1 -1
  318. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/signal_op.hpp +1 -1
  319. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/signal_set_service.hpp +12 -3
  320. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/socket_holder.hpp +1 -1
  321. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/socket_ops.hpp +1 -1
  322. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/socket_option.hpp +1 -1
  323. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/socket_select_interrupter.hpp +1 -1
  324. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/socket_types.hpp +11 -1
  325. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/source_location.hpp +1 -1
  326. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/static_mutex.hpp +3 -5
  327. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/std_event.hpp +1 -6
  328. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/std_fenced_block.hpp +1 -6
  329. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/std_global.hpp +1 -6
  330. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/std_mutex.hpp +1 -6
  331. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/std_static_mutex.hpp +1 -6
  332. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/std_thread.hpp +1 -6
  333. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/strand_executor_service.hpp +13 -13
  334. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/strand_service.hpp +1 -1
  335. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/string_view.hpp +1 -1
  336. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/thread.hpp +3 -5
  337. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/thread_context.hpp +1 -1
  338. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/thread_group.hpp +1 -1
  339. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/thread_info_base.hpp +12 -22
  340. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/throw_error.hpp +1 -1
  341. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/throw_exception.hpp +1 -1
  342. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timer_queue.hpp +1 -1
  343. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timer_queue_base.hpp +1 -1
  344. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timer_queue_ptime.hpp +2 -2
  345. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timer_queue_set.hpp +1 -1
  346. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timer_scheduler.hpp +1 -1
  347. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timer_scheduler_fwd.hpp +1 -1
  348. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/tss_ptr.hpp +1 -1
  349. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/type_traits.hpp +104 -90
  350. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/utility.hpp +4 -4
  351. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/wait_handler.hpp +3 -3
  352. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/wait_op.hpp +1 -1
  353. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/winsock_init.hpp +2 -2
  354. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/work_dispatcher.hpp +20 -34
  355. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/wrapped_handler.hpp +7 -117
  356. data/src/cxx_supportlib/vendor-modified/boost/asio/dispatch.hpp +36 -34
  357. data/src/cxx_supportlib/vendor-modified/boost/asio/error.hpp +1 -1
  358. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/allocator.hpp +34 -112
  359. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/any_executor.hpp +268 -991
  360. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/bad_executor.hpp +3 -4
  361. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/blocking.hpp +296 -536
  362. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/blocking_adaptation.hpp +232 -409
  363. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/context.hpp +20 -73
  364. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/context_as.hpp +30 -72
  365. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/executor.hpp +24 -170
  366. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/impl/bad_executor.ipp +3 -3
  367. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/invocable_archetype.hpp +2 -30
  368. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/mapping.hpp +240 -398
  369. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/occupancy.hpp +20 -73
  370. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/outstanding_work.hpp +149 -296
  371. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/prefer_only.hpp +56 -59
  372. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/relationship.hpp +149 -296
  373. data/src/cxx_supportlib/vendor-modified/boost/asio/execution.hpp +1 -16
  374. data/src/cxx_supportlib/vendor-modified/boost/asio/execution_context.hpp +1 -25
  375. data/src/cxx_supportlib/vendor-modified/boost/asio/executor.hpp +59 -43
  376. data/src/cxx_supportlib/vendor-modified/boost/asio/executor_work_guard.hpp +56 -61
  377. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/append.hpp +1 -1
  378. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/as_single.hpp +20 -24
  379. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/as_tuple.hpp +1 -1
  380. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/awaitable_operators.hpp +7 -7
  381. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/basic_channel.hpp +56 -34
  382. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/basic_concurrent_channel.hpp +56 -34
  383. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/cancellation_condition.hpp +25 -28
  384. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/channel.hpp +3 -3
  385. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/channel_error.hpp +1 -1
  386. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/channel_traits.hpp +15 -15
  387. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/co_composed.hpp +5 -4
  388. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/co_spawn.hpp +1 -1
  389. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/concurrent_channel.hpp +3 -3
  390. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/coro.hpp +1 -1
  391. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/coro_traits.hpp +1 -1
  392. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/deferred.hpp +1 -1
  393. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_handler.hpp +10 -13
  394. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_message.hpp +27 -20
  395. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_operation.hpp +193 -38
  396. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_payload.hpp +143 -14
  397. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_receive_op.hpp +24 -9
  398. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_send_functions.hpp +77 -17
  399. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_send_op.hpp +20 -12
  400. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_service.hpp +50 -50
  401. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/coro_completion_handler.hpp +3 -3
  402. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/coro_promise_allocator.hpp +1 -1
  403. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/has_signature.hpp +1 -1
  404. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/impl/channel_service.hpp +46 -34
  405. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/partial_promise.hpp +1 -1
  406. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/as_single.hpp +33 -96
  407. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/channel_error.ipp +2 -2
  408. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/co_composed.hpp +62 -20
  409. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/coro.hpp +48 -45
  410. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/parallel_group.hpp +56 -60
  411. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/promise.hpp +18 -4
  412. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/use_coro.hpp +5 -5
  413. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/use_promise.hpp +3 -3
  414. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/parallel_group.hpp +27 -31
  415. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/prepend.hpp +1 -1
  416. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/promise.hpp +1 -1
  417. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/use_coro.hpp +15 -21
  418. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/use_promise.hpp +13 -13
  419. data/src/cxx_supportlib/vendor-modified/boost/asio/file_base.hpp +1 -1
  420. data/src/cxx_supportlib/vendor-modified/boost/asio/generic/basic_endpoint.hpp +2 -6
  421. data/src/cxx_supportlib/vendor-modified/boost/asio/generic/datagram_protocol.hpp +4 -4
  422. data/src/cxx_supportlib/vendor-modified/boost/asio/generic/detail/endpoint.hpp +1 -1
  423. data/src/cxx_supportlib/vendor-modified/boost/asio/generic/detail/impl/endpoint.ipp +1 -1
  424. data/src/cxx_supportlib/vendor-modified/boost/asio/generic/raw_protocol.hpp +4 -4
  425. data/src/cxx_supportlib/vendor-modified/boost/asio/generic/seq_packet_protocol.hpp +4 -4
  426. data/src/cxx_supportlib/vendor-modified/boost/asio/generic/stream_protocol.hpp +4 -4
  427. data/src/cxx_supportlib/vendor-modified/boost/asio/handler_continuation_hook.hpp +1 -1
  428. data/src/cxx_supportlib/vendor-modified/boost/asio/high_resolution_timer.hpp +1 -6
  429. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/any_completion_executor.ipp +10 -14
  430. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/any_io_executor.ipp +10 -17
  431. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/append.hpp +37 -100
  432. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/as_tuple.hpp +99 -107
  433. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/awaitable.hpp +66 -25
  434. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/buffered_read_stream.hpp +55 -178
  435. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/buffered_write_stream.hpp +55 -178
  436. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/cancellation_signal.ipp +1 -1
  437. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/co_spawn.hpp +123 -73
  438. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/connect.hpp +84 -234
  439. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/connect_pipe.hpp +1 -1
  440. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/connect_pipe.ipp +1 -1
  441. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/consign.hpp +32 -97
  442. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/deferred.hpp +73 -31
  443. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/detached.hpp +5 -58
  444. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/error.ipp +4 -4
  445. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/execution_context.hpp +3 -35
  446. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/execution_context.ipp +1 -1
  447. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/executor.hpp +60 -43
  448. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/executor.ipp +3 -3
  449. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/io_context.hpp +39 -56
  450. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/io_context.ipp +2 -1
  451. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/multiple_exceptions.ipp +4 -8
  452. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/prepend.hpp +36 -98
  453. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read.hpp +206 -429
  454. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_at.hpp +60 -206
  455. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_until.hpp +456 -970
  456. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/redirect_error.hpp +43 -411
  457. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/serial_port_base.hpp +1 -1
  458. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/serial_port_base.ipp +1 -1
  459. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/spawn.hpp +207 -423
  460. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/src.hpp +1 -3
  461. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/system_context.hpp +2 -2
  462. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/system_context.ipp +2 -2
  463. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/system_executor.hpp +19 -25
  464. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/thread_pool.hpp +32 -109
  465. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/thread_pool.ipp +5 -4
  466. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/use_awaitable.hpp +2 -2
  467. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/use_future.hpp +79 -425
  468. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/write.hpp +213 -427
  469. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/write_at.hpp +58 -194
  470. data/src/cxx_supportlib/vendor-modified/boost/asio/io_context.hpp +91 -120
  471. data/src/cxx_supportlib/vendor-modified/boost/asio/io_context_strand.hpp +33 -25
  472. data/src/cxx_supportlib/vendor-modified/boost/asio/io_service.hpp +1 -1
  473. data/src/cxx_supportlib/vendor-modified/boost/asio/io_service_strand.hpp +1 -1
  474. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/address.hpp +26 -35
  475. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/address_v4.hpp +28 -36
  476. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/address_v4_iterator.hpp +13 -19
  477. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/address_v4_range.hpp +16 -22
  478. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/address_v6.hpp +33 -42
  479. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/address_v6_iterator.hpp +13 -18
  480. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/address_v6_range.hpp +15 -20
  481. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/bad_address_cast.hpp +13 -3
  482. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_endpoint.hpp +26 -35
  483. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver.hpp +46 -76
  484. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver_entry.hpp +1 -1
  485. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver_iterator.hpp +4 -8
  486. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver_query.hpp +17 -1
  487. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver_results.hpp +9 -13
  488. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/detail/endpoint.hpp +17 -17
  489. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/detail/impl/endpoint.ipp +10 -14
  490. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/detail/socket_option.hpp +1 -1
  491. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/host_name.hpp +1 -1
  492. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/icmp.hpp +7 -7
  493. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address.hpp +1 -1
  494. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address.ipp +18 -22
  495. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address_v4.hpp +1 -1
  496. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address_v4.ipp +9 -13
  497. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address_v6.hpp +1 -1
  498. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address_v6.ipp +24 -32
  499. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/basic_endpoint.hpp +1 -1
  500. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/host_name.ipp +1 -1
  501. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/network_v4.hpp +1 -1
  502. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/network_v4.ipp +3 -3
  503. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/network_v6.hpp +1 -1
  504. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/network_v6.ipp +3 -3
  505. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/multicast.hpp +1 -1
  506. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/network_v4.hpp +16 -20
  507. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/network_v6.hpp +14 -18
  508. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/resolver_base.hpp +1 -1
  509. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/resolver_query_base.hpp +1 -1
  510. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/tcp.hpp +7 -7
  511. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/udp.hpp +7 -7
  512. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/unicast.hpp +1 -1
  513. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/v6_only.hpp +1 -1
  514. data/src/cxx_supportlib/vendor-modified/boost/asio/is_applicable_property.hpp +6 -6
  515. data/src/cxx_supportlib/vendor-modified/boost/asio/is_contiguous_iterator.hpp +2 -2
  516. data/src/cxx_supportlib/vendor-modified/boost/asio/is_executor.hpp +1 -1
  517. data/src/cxx_supportlib/vendor-modified/boost/asio/is_read_buffered.hpp +1 -1
  518. data/src/cxx_supportlib/vendor-modified/boost/asio/is_write_buffered.hpp +1 -1
  519. data/src/cxx_supportlib/vendor-modified/boost/asio/local/basic_endpoint.hpp +2 -6
  520. data/src/cxx_supportlib/vendor-modified/boost/asio/local/connect_pair.hpp +1 -1
  521. data/src/cxx_supportlib/vendor-modified/boost/asio/local/datagram_protocol.hpp +4 -4
  522. data/src/cxx_supportlib/vendor-modified/boost/asio/local/detail/endpoint.hpp +1 -1
  523. data/src/cxx_supportlib/vendor-modified/boost/asio/local/detail/impl/endpoint.ipp +1 -1
  524. data/src/cxx_supportlib/vendor-modified/boost/asio/local/seq_packet_protocol.hpp +86 -0
  525. data/src/cxx_supportlib/vendor-modified/boost/asio/local/stream_protocol.hpp +4 -4
  526. data/src/cxx_supportlib/vendor-modified/boost/asio/multiple_exceptions.hpp +3 -9
  527. data/src/cxx_supportlib/vendor-modified/boost/asio/packaged_task.hpp +1 -61
  528. data/src/cxx_supportlib/vendor-modified/boost/asio/placeholders.hpp +29 -105
  529. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/basic_descriptor.hpp +21 -29
  530. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/basic_stream_descriptor.hpp +24 -34
  531. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/descriptor.hpp +1 -1
  532. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/descriptor_base.hpp +1 -1
  533. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/stream_descriptor.hpp +1 -1
  534. data/src/cxx_supportlib/vendor-modified/boost/asio/post.hpp +36 -34
  535. data/src/cxx_supportlib/vendor-modified/boost/asio/prefer.hpp +176 -333
  536. data/src/cxx_supportlib/vendor-modified/boost/asio/prepend.hpp +11 -23
  537. data/src/cxx_supportlib/vendor-modified/boost/asio/query.hpp +57 -70
  538. data/src/cxx_supportlib/vendor-modified/boost/asio/random_access_file.hpp +1 -1
  539. data/src/cxx_supportlib/vendor-modified/boost/asio/read.hpp +136 -168
  540. data/src/cxx_supportlib/vendor-modified/boost/asio/read_at.hpp +35 -52
  541. data/src/cxx_supportlib/vendor-modified/boost/asio/read_until.hpp +256 -298
  542. data/src/cxx_supportlib/vendor-modified/boost/asio/readable_pipe.hpp +1 -1
  543. data/src/cxx_supportlib/vendor-modified/boost/asio/recycling_allocator.hpp +15 -15
  544. data/src/cxx_supportlib/vendor-modified/boost/asio/redirect_error.hpp +7 -9
  545. data/src/cxx_supportlib/vendor-modified/boost/asio/registered_buffer.hpp +35 -47
  546. data/src/cxx_supportlib/vendor-modified/boost/asio/require.hpp +108 -246
  547. data/src/cxx_supportlib/vendor-modified/boost/asio/require_concept.hpp +70 -79
  548. data/src/cxx_supportlib/vendor-modified/boost/asio/serial_port.hpp +1 -1
  549. data/src/cxx_supportlib/vendor-modified/boost/asio/serial_port_base.hpp +1 -1
  550. data/src/cxx_supportlib/vendor-modified/boost/asio/signal_set.hpp +1 -1
  551. data/src/cxx_supportlib/vendor-modified/boost/asio/signal_set_base.hpp +173 -0
  552. data/src/cxx_supportlib/vendor-modified/boost/asio/socket_base.hpp +1 -1
  553. data/src/cxx_supportlib/vendor-modified/boost/asio/spawn.hpp +127 -161
  554. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/context.hpp +1 -3
  555. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/context_base.hpp +24 -24
  556. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/buffered_handshake_op.hpp +3 -3
  557. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/engine.hpp +3 -7
  558. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/handshake_op.hpp +3 -3
  559. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/impl/engine.ipp +3 -7
  560. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/impl/openssl_init.ipp +2 -2
  561. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/io.hpp +16 -75
  562. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/openssl_init.hpp +1 -1
  563. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/openssl_types.hpp +1 -1
  564. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/password_callback.hpp +1 -1
  565. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/read_op.hpp +3 -3
  566. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/shutdown_op.hpp +4 -4
  567. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/stream_core.hpp +15 -19
  568. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/verify_callback.hpp +2 -2
  569. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/write_op.hpp +3 -3
  570. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/error.hpp +1 -1
  571. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/host_name_verification.hpp +1 -1
  572. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/context.hpp +1 -1
  573. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/context.ipp +2 -4
  574. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/error.ipp +3 -3
  575. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/host_name_verification.ipp +1 -1
  576. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/rfc2818_verification.ipp +1 -1
  577. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/src.hpp +1 -1
  578. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/rfc2818_verification.hpp +1 -1
  579. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/stream.hpp +51 -82
  580. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/stream_base.hpp +1 -1
  581. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/verify_context.hpp +1 -1
  582. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/verify_mode.hpp +1 -1
  583. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl.hpp +1 -1
  584. data/src/cxx_supportlib/vendor-modified/boost/asio/static_thread_pool.hpp +1 -1
  585. data/src/cxx_supportlib/vendor-modified/boost/asio/steady_timer.hpp +1 -6
  586. data/src/cxx_supportlib/vendor-modified/boost/asio/strand.hpp +91 -118
  587. data/src/cxx_supportlib/vendor-modified/boost/asio/stream_file.hpp +1 -1
  588. data/src/cxx_supportlib/vendor-modified/boost/asio/streambuf.hpp +1 -1
  589. data/src/cxx_supportlib/vendor-modified/boost/asio/system_context.hpp +3 -3
  590. data/src/cxx_supportlib/vendor-modified/boost/asio/system_executor.hpp +62 -62
  591. data/src/cxx_supportlib/vendor-modified/boost/asio/system_timer.hpp +1 -6
  592. data/src/cxx_supportlib/vendor-modified/boost/asio/this_coro.hpp +35 -48
  593. data/src/cxx_supportlib/vendor-modified/boost/asio/thread_pool.hpp +91 -273
  594. data/src/cxx_supportlib/vendor-modified/boost/asio/time_traits.hpp +1 -1
  595. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/equality_comparable.hpp +14 -18
  596. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/execute_member.hpp +16 -20
  597. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/prefer_free.hpp +16 -20
  598. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/prefer_member.hpp +16 -20
  599. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/query_free.hpp +16 -20
  600. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/query_member.hpp +16 -20
  601. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/query_static_constexpr_member.hpp +15 -22
  602. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/require_concept_free.hpp +16 -20
  603. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/require_concept_member.hpp +16 -20
  604. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/require_free.hpp +16 -20
  605. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/require_member.hpp +16 -20
  606. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/static_query.hpp +20 -26
  607. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/static_require.hpp +22 -30
  608. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/static_require_concept.hpp +22 -30
  609. data/src/cxx_supportlib/vendor-modified/boost/asio/ts/buffer.hpp +1 -1
  610. data/src/cxx_supportlib/vendor-modified/boost/asio/ts/executor.hpp +1 -1
  611. data/src/cxx_supportlib/vendor-modified/boost/asio/ts/internet.hpp +1 -1
  612. data/src/cxx_supportlib/vendor-modified/boost/asio/ts/io_context.hpp +1 -1
  613. data/src/cxx_supportlib/vendor-modified/boost/asio/ts/net.hpp +1 -1
  614. data/src/cxx_supportlib/vendor-modified/boost/asio/ts/netfwd.hpp +6 -24
  615. data/src/cxx_supportlib/vendor-modified/boost/asio/ts/socket.hpp +1 -1
  616. data/src/cxx_supportlib/vendor-modified/boost/asio/ts/timer.hpp +1 -1
  617. data/src/cxx_supportlib/vendor-modified/boost/asio/unyield.hpp +1 -1
  618. data/src/cxx_supportlib/vendor-modified/boost/asio/use_awaitable.hpp +15 -21
  619. data/src/cxx_supportlib/vendor-modified/boost/asio/use_future.hpp +8 -12
  620. data/src/cxx_supportlib/vendor-modified/boost/asio/uses_executor.hpp +2 -6
  621. data/src/cxx_supportlib/vendor-modified/boost/asio/version.hpp +2 -2
  622. data/src/cxx_supportlib/vendor-modified/boost/asio/wait_traits.hpp +1 -1
  623. data/src/cxx_supportlib/vendor-modified/boost/asio/writable_pipe.hpp +1 -1
  624. data/src/cxx_supportlib/vendor-modified/boost/asio/write.hpp +122 -146
  625. data/src/cxx_supportlib/vendor-modified/boost/asio/write_at.hpp +34 -50
  626. data/src/cxx_supportlib/vendor-modified/boost/asio/yield.hpp +1 -1
  627. data/src/cxx_supportlib/vendor-modified/boost/asio.hpp +6 -28
  628. data/src/cxx_supportlib/vendor-modified/boost/assert/source_location.hpp +8 -3
  629. data/src/cxx_supportlib/vendor-modified/boost/atomic/atomic.hpp +2 -16
  630. data/src/cxx_supportlib/vendor-modified/boost/atomic/atomic_ref.hpp +2 -3
  631. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/atomic_ref_impl.hpp +5 -3
  632. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/bitwise_cast.hpp +6 -4
  633. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/config.hpp +0 -49
  634. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_gcc_x86.hpp +107 -40
  635. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_msvc_x86.hpp +32 -5
  636. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_operations_emulated.hpp +12 -13
  637. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_fp_ops_emulated.hpp +7 -8
  638. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_ops_emulated.hpp +26 -27
  639. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/float_sizes.hpp +122 -35
  640. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fp_ops_emulated.hpp +2 -3
  641. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/pause.hpp +7 -0
  642. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/remove_cv.hpp +42 -0
  643. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/wait_on_address.hpp +1 -2
  644. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/wait_ops_emulated.hpp +3 -4
  645. data/src/cxx_supportlib/vendor-modified/boost/atomic/ipc_atomic.hpp +2 -3
  646. data/src/cxx_supportlib/vendor-modified/boost/atomic/ipc_atomic_ref.hpp +2 -3
  647. data/src/cxx_supportlib/vendor-modified/boost/bind/apply.hpp +2 -60
  648. data/src/cxx_supportlib/vendor-modified/boost/bind/bind.hpp +230 -1740
  649. data/src/cxx_supportlib/vendor-modified/boost/bind/{bind_cc.hpp → detail/bind_cc.hpp} +20 -20
  650. data/src/cxx_supportlib/vendor-modified/boost/bind/detail/bind_mf2_cc.hpp +210 -0
  651. data/src/cxx_supportlib/vendor-modified/boost/bind/detail/bind_mf_cc.hpp +405 -0
  652. data/src/cxx_supportlib/vendor-modified/boost/bind/detail/integer_sequence.hpp +111 -0
  653. data/src/cxx_supportlib/vendor-modified/boost/bind/detail/result_traits.hpp +1 -0
  654. data/src/cxx_supportlib/vendor-modified/boost/bind/detail/tuple_for_each.hpp +64 -0
  655. data/src/cxx_supportlib/vendor-modified/boost/bind/mem_fn.hpp +140 -290
  656. data/src/cxx_supportlib/vendor-modified/boost/bind/placeholders.hpp +3 -16
  657. data/src/cxx_supportlib/vendor-modified/boost/bind/protect.hpp +0 -279
  658. data/src/cxx_supportlib/vendor-modified/boost/bind/std_placeholders.hpp +0 -6
  659. data/src/cxx_supportlib/vendor-modified/boost/chrono/config.hpp +1 -0
  660. data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/is_evenly_divisible_by.hpp +1 -7
  661. data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/requires_cxx11.hpp +23 -0
  662. data/src/cxx_supportlib/vendor-modified/boost/chrono/duration.hpp +2 -1
  663. data/src/cxx_supportlib/vendor-modified/boost/chrono/io/duration_get.hpp +1 -1
  664. data/src/cxx_supportlib/vendor-modified/boost/chrono/io/duration_units.hpp +1 -0
  665. data/src/cxx_supportlib/vendor-modified/boost/chrono/io_v1/chrono_io.hpp +3 -3
  666. data/src/cxx_supportlib/vendor-modified/boost/chrono/system_clocks.hpp +1 -0
  667. data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx03.hpp +1 -1
  668. data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx11.hpp +4 -1
  669. data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx14.hpp +1 -1
  670. data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx17.hpp +4 -1
  671. data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx20.hpp +1 -1
  672. data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx23.hpp +41 -0
  673. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/borland.hpp +4 -0
  674. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/clang.hpp +8 -0
  675. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/clang_version.hpp +8 -2
  676. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/codegear.hpp +5 -0
  677. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/common_edg.hpp +4 -1
  678. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/cray.hpp +1 -0
  679. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/digitalmars.hpp +4 -0
  680. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/gcc.hpp +4 -0
  681. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/gcc_xml.hpp +4 -2
  682. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/hp_acc.hpp +5 -0
  683. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/intel.hpp +1 -0
  684. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/metrowerks.hpp +4 -0
  685. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/mpw.hpp +4 -0
  686. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/nvcc.hpp +3 -0
  687. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/pathscale.hpp +4 -0
  688. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/sunpro_cc.hpp +4 -0
  689. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/vacpp.hpp +4 -0
  690. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/visualc.hpp +13 -3
  691. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/xlcpp.hpp +8 -0
  692. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/xlcpp_zos.hpp +2 -0
  693. data/src/cxx_supportlib/vendor-modified/boost/config/detail/cxx_composite.hpp +16 -1
  694. data/src/cxx_supportlib/vendor-modified/boost/config/detail/suffix.hpp +56 -0
  695. data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/dinkumware.hpp +32 -0
  696. data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/libstdcpp3.hpp +16 -1
  697. data/src/cxx_supportlib/vendor-modified/boost/container/adaptive_pool.hpp +6 -7
  698. data/src/cxx_supportlib/vendor-modified/boost/container/allocator.hpp +18 -19
  699. data/src/cxx_supportlib/vendor-modified/boost/container/allocator_traits.hpp +27 -29
  700. data/src/cxx_supportlib/vendor-modified/boost/container/container_fwd.hpp +0 -29
  701. data/src/cxx_supportlib/vendor-modified/boost/container/deque.hpp +144 -145
  702. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool_impl.hpp +4 -5
  703. data/src/cxx_supportlib/vendor-modified/boost/container/detail/advanced_insert_int.hpp +48 -49
  704. data/src/cxx_supportlib/vendor-modified/boost/container/detail/alloc_helpers.hpp +6 -6
  705. data/src/cxx_supportlib/vendor-modified/boost/container/detail/allocator_version_traits.hpp +14 -15
  706. data/src/cxx_supportlib/vendor-modified/boost/container/detail/compare_functors.hpp +22 -22
  707. data/src/cxx_supportlib/vendor-modified/boost/container/detail/config_begin.hpp +1 -0
  708. data/src/cxx_supportlib/vendor-modified/boost/container/detail/copy_move_algo.hpp +71 -69
  709. data/src/cxx_supportlib/vendor-modified/boost/container/detail/destroyers.hpp +48 -48
  710. data/src/cxx_supportlib/vendor-modified/boost/container/detail/dispatch_uses_allocator.hpp +38 -40
  711. data/src/cxx_supportlib/vendor-modified/boost/container/detail/flat_tree.hpp +165 -153
  712. data/src/cxx_supportlib/vendor-modified/boost/container/detail/iterators.hpp +162 -163
  713. data/src/cxx_supportlib/vendor-modified/boost/container/detail/math_functions.hpp +1 -2
  714. data/src/cxx_supportlib/vendor-modified/boost/container/detail/mutex.hpp +48 -12
  715. data/src/cxx_supportlib/vendor-modified/boost/container/detail/next_capacity.hpp +6 -8
  716. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_alloc_holder.hpp +44 -46
  717. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_pool_impl.hpp +10 -11
  718. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pair.hpp +18 -19
  719. data/src/cxx_supportlib/vendor-modified/boost/container/detail/placement_new.hpp +0 -8
  720. data/src/cxx_supportlib/vendor-modified/boost/container/detail/transform_iterator.hpp +28 -28
  721. data/src/cxx_supportlib/vendor-modified/boost/container/detail/tree.hpp +83 -84
  722. data/src/cxx_supportlib/vendor-modified/boost/container/detail/value_init.hpp +3 -3
  723. data/src/cxx_supportlib/vendor-modified/boost/container/detail/workaround.hpp +77 -1
  724. data/src/cxx_supportlib/vendor-modified/boost/container/devector.hpp +81 -85
  725. data/src/cxx_supportlib/vendor-modified/boost/container/flat_map.hpp +231 -233
  726. data/src/cxx_supportlib/vendor-modified/boost/container/flat_set.hpp +86 -86
  727. data/src/cxx_supportlib/vendor-modified/boost/container/list.hpp +33 -33
  728. data/src/cxx_supportlib/vendor-modified/boost/container/map.hpp +107 -110
  729. data/src/cxx_supportlib/vendor-modified/boost/container/new_allocator.hpp +9 -11
  730. data/src/cxx_supportlib/vendor-modified/boost/container/node_allocator.hpp +10 -11
  731. data/src/cxx_supportlib/vendor-modified/boost/container/node_handle.hpp +29 -17
  732. data/src/cxx_supportlib/vendor-modified/boost/container/options.hpp +2 -2
  733. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/memory_resource.hpp +1 -1
  734. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/polymorphic_allocator.hpp +1 -0
  735. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/resource_adaptor.hpp +1 -1
  736. data/src/cxx_supportlib/vendor-modified/boost/container/scoped_allocator.hpp +80 -82
  737. data/src/cxx_supportlib/vendor-modified/boost/container/set.hpp +81 -81
  738. data/src/cxx_supportlib/vendor-modified/boost/container/slist.hpp +24 -26
  739. data/src/cxx_supportlib/vendor-modified/boost/container/small_vector.hpp +147 -122
  740. data/src/cxx_supportlib/vendor-modified/boost/container/stable_vector.hpp +109 -110
  741. data/src/cxx_supportlib/vendor-modified/boost/container/static_vector.hpp +32 -32
  742. data/src/cxx_supportlib/vendor-modified/boost/container/string.hpp +165 -194
  743. data/src/cxx_supportlib/vendor-modified/boost/container/throw_exception.hpp +4 -5
  744. data/src/cxx_supportlib/vendor-modified/boost/container/vector.hpp +263 -199
  745. data/src/cxx_supportlib/vendor-modified/boost/container_hash/detail/hash_integral.hpp +146 -0
  746. data/src/cxx_supportlib/vendor-modified/boost/container_hash/detail/hash_mix.hpp +6 -6
  747. data/src/cxx_supportlib/vendor-modified/boost/container_hash/detail/hash_range.hpp +296 -61
  748. data/src/cxx_supportlib/vendor-modified/boost/container_hash/detail/hash_tuple_like.hpp +62 -0
  749. data/src/cxx_supportlib/vendor-modified/boost/container_hash/detail/mulx.hpp +79 -0
  750. data/src/cxx_supportlib/vendor-modified/boost/container_hash/hash.hpp +38 -124
  751. data/src/cxx_supportlib/vendor-modified/boost/container_hash/hash_fwd.hpp +1 -0
  752. data/src/cxx_supportlib/vendor-modified/boost/container_hash/is_contiguous_range.hpp +27 -20
  753. data/src/cxx_supportlib/vendor-modified/boost/container_hash/is_described_class.hpp +4 -5
  754. data/src/cxx_supportlib/vendor-modified/boost/container_hash/is_range.hpp +8 -40
  755. data/src/cxx_supportlib/vendor-modified/boost/container_hash/is_tuple_like.hpp +36 -0
  756. data/src/cxx_supportlib/vendor-modified/boost/container_hash/is_unordered_range.hpp +6 -7
  757. data/src/cxx_supportlib/vendor-modified/boost/core/alignof.hpp +57 -0
  758. data/src/cxx_supportlib/vendor-modified/boost/core/allocator_access.hpp +22 -8
  759. data/src/cxx_supportlib/vendor-modified/boost/core/bit.hpp +362 -31
  760. data/src/cxx_supportlib/vendor-modified/boost/core/checked_delete.hpp +29 -3
  761. data/src/cxx_supportlib/vendor-modified/boost/core/data.hpp +46 -0
  762. data/src/cxx_supportlib/vendor-modified/boost/core/detail/is_same.hpp +39 -0
  763. data/src/cxx_supportlib/vendor-modified/boost/core/detail/lwt_unattended.hpp +66 -0
  764. data/src/cxx_supportlib/vendor-modified/boost/core/detail/sp_thread_pause.hpp +71 -0
  765. data/src/cxx_supportlib/vendor-modified/boost/{smart_ptr → core}/detail/sp_thread_sleep.hpp +39 -21
  766. data/src/cxx_supportlib/vendor-modified/boost/core/detail/sp_thread_yield.hpp +100 -0
  767. data/src/cxx_supportlib/vendor-modified/boost/core/detail/string_view.hpp +7 -7
  768. data/src/cxx_supportlib/vendor-modified/boost/core/fclose_deleter.hpp +7 -0
  769. data/src/cxx_supportlib/vendor-modified/boost/core/functor.hpp +41 -0
  770. data/src/cxx_supportlib/vendor-modified/boost/core/identity.hpp +61 -0
  771. data/src/cxx_supportlib/vendor-modified/boost/core/invoke_swap.hpp +93 -0
  772. data/src/cxx_supportlib/vendor-modified/boost/core/is_same.hpp +10 -15
  773. data/src/cxx_supportlib/vendor-modified/boost/core/launder.hpp +69 -0
  774. data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test.hpp +33 -36
  775. data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test_trait.hpp +3 -3
  776. data/src/cxx_supportlib/vendor-modified/boost/core/make_span.hpp +59 -0
  777. data/src/cxx_supportlib/vendor-modified/boost/core/max_align.hpp +82 -0
  778. data/src/cxx_supportlib/vendor-modified/boost/core/memory_resource.hpp +108 -0
  779. data/src/cxx_supportlib/vendor-modified/boost/core/null_deleter.hpp +7 -0
  780. data/src/cxx_supportlib/vendor-modified/boost/core/ref.hpp +23 -16
  781. data/src/cxx_supportlib/vendor-modified/boost/core/serialization.hpp +131 -0
  782. data/src/cxx_supportlib/vendor-modified/boost/core/size.hpp +31 -0
  783. data/src/cxx_supportlib/vendor-modified/boost/core/snprintf.hpp +173 -0
  784. data/src/cxx_supportlib/vendor-modified/boost/core/span.hpp +17 -17
  785. data/src/cxx_supportlib/vendor-modified/boost/core/swap.hpp +10 -40
  786. data/src/cxx_supportlib/vendor-modified/boost/core/type_name.hpp +29 -5
  787. data/src/cxx_supportlib/vendor-modified/boost/core/yield_primitives.hpp +12 -0
  788. data/src/cxx_supportlib/vendor-modified/boost/describe/members.hpp +2 -0
  789. data/src/cxx_supportlib/vendor-modified/boost/detail/basic_pointerbuf.hpp +3 -6
  790. data/src/cxx_supportlib/vendor-modified/boost/detail/lcast_precision.hpp +6 -97
  791. data/src/cxx_supportlib/vendor-modified/boost/exception/current_exception_cast.hpp +1 -1
  792. data/src/cxx_supportlib/vendor-modified/boost/exception/detail/clone_current_exception.hpp +1 -1
  793. data/src/cxx_supportlib/vendor-modified/boost/exception/detail/error_info_impl.hpp +1 -1
  794. data/src/cxx_supportlib/vendor-modified/boost/exception/detail/exception_ptr.hpp +22 -10
  795. data/src/cxx_supportlib/vendor-modified/boost/exception/detail/is_output_streamable.hpp +1 -1
  796. data/src/cxx_supportlib/vendor-modified/boost/exception/detail/object_hex_dump.hpp +1 -1
  797. data/src/cxx_supportlib/vendor-modified/boost/exception/detail/requires_cxx11.hpp +24 -0
  798. data/src/cxx_supportlib/vendor-modified/boost/exception/detail/type_info.hpp +1 -1
  799. data/src/cxx_supportlib/vendor-modified/boost/exception/diagnostic_information.hpp +4 -4
  800. data/src/cxx_supportlib/vendor-modified/boost/exception/exception.hpp +1 -1
  801. data/src/cxx_supportlib/vendor-modified/boost/exception/get_error_info.hpp +1 -1
  802. data/src/cxx_supportlib/vendor-modified/boost/exception/info.hpp +1 -1
  803. data/src/cxx_supportlib/vendor-modified/boost/exception/to_string.hpp +2 -2
  804. data/src/cxx_supportlib/vendor-modified/boost/exception/to_string_stub.hpp +1 -1
  805. data/src/cxx_supportlib/vendor-modified/boost/function/function0.hpp +1 -3
  806. data/src/cxx_supportlib/vendor-modified/boost/function/function1.hpp +1 -3
  807. data/src/cxx_supportlib/vendor-modified/boost/function/function10.hpp +1 -3
  808. data/src/cxx_supportlib/vendor-modified/boost/function/function2.hpp +1 -3
  809. data/src/cxx_supportlib/vendor-modified/boost/function/function3.hpp +1 -3
  810. data/src/cxx_supportlib/vendor-modified/boost/function/function4.hpp +1 -3
  811. data/src/cxx_supportlib/vendor-modified/boost/function/function5.hpp +1 -3
  812. data/src/cxx_supportlib/vendor-modified/boost/function/function6.hpp +1 -3
  813. data/src/cxx_supportlib/vendor-modified/boost/function/function7.hpp +1 -3
  814. data/src/cxx_supportlib/vendor-modified/boost/function/function8.hpp +1 -3
  815. data/src/cxx_supportlib/vendor-modified/boost/function/function9.hpp +1 -3
  816. data/src/cxx_supportlib/vendor-modified/boost/function/function_base.hpp +49 -198
  817. data/src/cxx_supportlib/vendor-modified/boost/function/function_fwd.hpp +36 -41
  818. data/src/cxx_supportlib/vendor-modified/boost/function/function_template.hpp +277 -420
  819. data/src/cxx_supportlib/vendor-modified/boost/function/function_typeof.hpp +1 -31
  820. data/src/cxx_supportlib/vendor-modified/boost/function.hpp +5 -61
  821. data/src/cxx_supportlib/vendor-modified/boost/integer/extended_euclidean.hpp +2 -2
  822. data/src/cxx_supportlib/vendor-modified/boost/intrusive/avl_set.hpp +24 -25
  823. data/src/cxx_supportlib/vendor-modified/boost/intrusive/avltree.hpp +12 -13
  824. data/src/cxx_supportlib/vendor-modified/boost/intrusive/avltree_algorithms.hpp +1 -1
  825. data/src/cxx_supportlib/vendor-modified/boost/intrusive/bs_set.hpp +24 -25
  826. data/src/cxx_supportlib/vendor-modified/boost/intrusive/bstree.hpp +65 -66
  827. data/src/cxx_supportlib/vendor-modified/boost/intrusive/bstree_algorithms.hpp +20 -20
  828. data/src/cxx_supportlib/vendor-modified/boost/intrusive/circular_list_algorithms.hpp +7 -7
  829. data/src/cxx_supportlib/vendor-modified/boost/intrusive/circular_slist_algorithms.hpp +10 -10
  830. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/any_node_and_algorithms.hpp +3 -3
  831. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/array_initializer.hpp +5 -5
  832. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/common_slist_algorithms.hpp +10 -10
  833. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/default_header_holder.hpp +3 -3
  834. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/ebo_functor_holder.hpp +24 -24
  835. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/equal_to_value.hpp +1 -1
  836. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/exception_disposer.hpp +1 -1
  837. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/generic_hook.hpp +14 -15
  838. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hash.hpp +277 -0
  839. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hash_combine.hpp +11 -49
  840. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hash_integral.hpp +119 -0
  841. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hash_mix.hpp +130 -0
  842. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hashtable_node.hpp +41 -41
  843. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hook_traits.hpp +14 -20
  844. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/iiterator.hpp +6 -6
  845. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/iterator.hpp +12 -12
  846. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/key_nodeptr_comp.hpp +7 -7
  847. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/list_iterator.hpp +19 -19
  848. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/mpl.hpp +6 -0
  849. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/node_cloner_disposer.hpp +3 -3
  850. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/parent_from_member.hpp +6 -17
  851. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/simple_disposers.hpp +1 -1
  852. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/size_holder.hpp +14 -14
  853. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/slist_iterator.hpp +20 -20
  854. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/transform_iterator.hpp +22 -22
  855. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/tree_iterator.hpp +21 -21
  856. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/tree_value_compare.hpp +28 -28
  857. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/workaround.hpp +58 -1
  858. data/src/cxx_supportlib/vendor-modified/boost/intrusive/hashtable.hpp +268 -239
  859. data/src/cxx_supportlib/vendor-modified/boost/intrusive/linear_slist_algorithms.hpp +9 -9
  860. data/src/cxx_supportlib/vendor-modified/boost/intrusive/list.hpp +57 -58
  861. data/src/cxx_supportlib/vendor-modified/boost/intrusive/pack_options.hpp +3 -3
  862. data/src/cxx_supportlib/vendor-modified/boost/intrusive/pointer_traits.hpp +18 -18
  863. data/src/cxx_supportlib/vendor-modified/boost/intrusive/priority_compare.hpp +3 -3
  864. data/src/cxx_supportlib/vendor-modified/boost/intrusive/rbtree.hpp +12 -13
  865. data/src/cxx_supportlib/vendor-modified/boost/intrusive/set.hpp +24 -25
  866. data/src/cxx_supportlib/vendor-modified/boost/intrusive/sg_set.hpp +24 -25
  867. data/src/cxx_supportlib/vendor-modified/boost/intrusive/sgtree.hpp +14 -15
  868. data/src/cxx_supportlib/vendor-modified/boost/intrusive/sgtree_algorithms.hpp +1 -1
  869. data/src/cxx_supportlib/vendor-modified/boost/intrusive/slist.hpp +61 -62
  870. data/src/cxx_supportlib/vendor-modified/boost/intrusive/splay_set.hpp +24 -25
  871. data/src/cxx_supportlib/vendor-modified/boost/intrusive/splaytree.hpp +12 -13
  872. data/src/cxx_supportlib/vendor-modified/boost/intrusive/treap.hpp +18 -19
  873. data/src/cxx_supportlib/vendor-modified/boost/intrusive/treap_algorithms.hpp +4 -0
  874. data/src/cxx_supportlib/vendor-modified/boost/intrusive/treap_set.hpp +36 -37
  875. data/src/cxx_supportlib/vendor-modified/boost/intrusive/unordered_set.hpp +37 -34
  876. data/src/cxx_supportlib/vendor-modified/boost/intrusive/unordered_set_hook.hpp +11 -11
  877. data/src/cxx_supportlib/vendor-modified/boost/io/ios_state.hpp +2 -2
  878. data/src/cxx_supportlib/vendor-modified/boost/iterator/detail/facade_iterator_category.hpp +10 -11
  879. data/src/cxx_supportlib/vendor-modified/boost/iterator/is_iterator.hpp +148 -0
  880. data/src/cxx_supportlib/vendor-modified/boost/iterator/iterator_concepts.hpp +2 -2
  881. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/bad_lexical_cast.hpp +7 -13
  882. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/buffer_view.hpp +59 -0
  883. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical.hpp +113 -131
  884. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical_streams.hpp +612 -645
  885. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_numeric.hpp +85 -79
  886. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/inf_nan.hpp +25 -32
  887. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/is_character.hpp +22 -29
  888. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_basic_unlockedbuf.hpp +73 -0
  889. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_char_constants.hpp +1 -1
  890. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_unsigned_converters.hpp +21 -16
  891. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/widest_char.hpp +7 -9
  892. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/try_lexical_convert.hpp +22 -161
  893. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast.hpp +9 -12
  894. data/src/cxx_supportlib/vendor-modified/boost/libs/chrono/src/chrono.cpp +4 -2
  895. data/src/cxx_supportlib/vendor-modified/boost/libs/chrono/src/process_cpu_clocks.cpp +3 -1
  896. data/src/cxx_supportlib/vendor-modified/boost/libs/chrono/src/thread_clock.cpp +3 -1
  897. data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/posix_api.cpp +10 -18
  898. data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/wide_posix_api.cpp +13 -14
  899. data/src/cxx_supportlib/vendor-modified/boost/libs/thread/src/pthread/thread.cpp +24 -14
  900. data/src/cxx_supportlib/vendor-modified/boost/limits.hpp +12 -12
  901. data/src/cxx_supportlib/vendor-modified/boost/move/adl_move_swap.hpp +5 -5
  902. data/src/cxx_supportlib/vendor-modified/boost/move/algo/adaptive_merge.hpp +5 -3
  903. data/src/cxx_supportlib/vendor-modified/boost/move/algo/adaptive_sort.hpp +20 -19
  904. data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/adaptive_sort_merge.hpp +41 -56
  905. data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/basic_op.hpp +11 -10
  906. data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/heap_sort.hpp +3 -2
  907. data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/merge.hpp +32 -34
  908. data/src/cxx_supportlib/vendor-modified/boost/move/algo/move.hpp +4 -5
  909. data/src/cxx_supportlib/vendor-modified/boost/move/algo/predicate.hpp +11 -11
  910. data/src/cxx_supportlib/vendor-modified/boost/move/algorithm.hpp +0 -1
  911. data/src/cxx_supportlib/vendor-modified/boost/move/core.hpp +3 -3
  912. data/src/cxx_supportlib/vendor-modified/boost/move/default_delete.hpp +5 -6
  913. data/src/cxx_supportlib/vendor-modified/boost/move/detail/iterator_to_raw_pointer.hpp +3 -3
  914. data/src/cxx_supportlib/vendor-modified/boost/move/detail/meta_utils.hpp +2 -2
  915. data/src/cxx_supportlib/vendor-modified/boost/move/detail/move_helpers.hpp +24 -24
  916. data/src/cxx_supportlib/vendor-modified/boost/move/detail/nsec_clock.hpp +65 -24
  917. data/src/cxx_supportlib/vendor-modified/boost/move/detail/reverse_iterator.hpp +28 -28
  918. data/src/cxx_supportlib/vendor-modified/boost/move/detail/to_raw_pointer.hpp +1 -1
  919. data/src/cxx_supportlib/vendor-modified/boost/move/detail/type_traits.hpp +72 -23
  920. data/src/cxx_supportlib/vendor-modified/boost/move/detail/workaround.hpp +81 -1
  921. data/src/cxx_supportlib/vendor-modified/boost/move/iterator.hpp +22 -22
  922. data/src/cxx_supportlib/vendor-modified/boost/move/unique_ptr.hpp +65 -66
  923. data/src/cxx_supportlib/vendor-modified/boost/move/utility.hpp +2 -2
  924. data/src/cxx_supportlib/vendor-modified/boost/move/utility_core.hpp +8 -6
  925. data/src/cxx_supportlib/vendor-modified/boost/mp11/algorithm.hpp +97 -17
  926. data/src/cxx_supportlib/vendor-modified/boost/mp11/bind.hpp +9 -0
  927. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/config.hpp +11 -0
  928. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_append.hpp +140 -4
  929. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_defer.hpp +119 -0
  930. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_fold.hpp +108 -4
  931. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_front.hpp +13 -1
  932. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_is_value_list.hpp +41 -0
  933. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_list_v.hpp +27 -0
  934. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_map_find.hpp +1 -1
  935. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_plus.hpp +4 -1
  936. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_rename.hpp +18 -5
  937. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_value.hpp +25 -0
  938. data/src/cxx_supportlib/vendor-modified/boost/mp11/integer_sequence.hpp +9 -0
  939. data/src/cxx_supportlib/vendor-modified/boost/mp11/integral.hpp +10 -0
  940. data/src/cxx_supportlib/vendor-modified/boost/mp11/list.hpp +180 -3
  941. data/src/cxx_supportlib/vendor-modified/boost/mp11/utility.hpp +2 -96
  942. data/src/cxx_supportlib/vendor-modified/boost/mp11/version.hpp +1 -1
  943. data/src/cxx_supportlib/vendor-modified/boost/mpl/assert.hpp +3 -3
  944. data/src/cxx_supportlib/vendor-modified/boost/next_prior.hpp +3 -44
  945. data/src/cxx_supportlib/vendor-modified/boost/nondet_random.hpp +22 -0
  946. data/src/cxx_supportlib/vendor-modified/boost/none_t.hpp +8 -0
  947. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/old_optional_implementation.hpp +5 -4
  948. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_config.hpp +3 -3
  949. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_reference_spec.hpp +2 -2
  950. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_relops.hpp +1 -1
  951. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_swap.hpp +6 -6
  952. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_trivially_copyable_base.hpp +3 -3
  953. data/src/cxx_supportlib/vendor-modified/boost/optional/optional.hpp +4 -4
  954. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/pack/tag_keyword_arg_ref.hpp +2 -2
  955. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/pack/unmatched_argument.hpp +1 -1
  956. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/preprocessor/overloads.hpp +1 -1
  957. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/tag.hpp +4 -4
  958. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/unwrap_cv_reference.hpp +1 -1
  959. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/void.hpp +1 -1
  960. data/src/cxx_supportlib/vendor-modified/boost/parameter/binding.hpp +3 -3
  961. data/src/cxx_supportlib/vendor-modified/boost/parameter/match.hpp +1 -1
  962. data/src/cxx_supportlib/vendor-modified/boost/parameter/template_keyword.hpp +1 -1
  963. data/src/cxx_supportlib/vendor-modified/boost/parameter/value_type.hpp +3 -3
  964. data/src/cxx_supportlib/vendor-modified/boost/pool/pool.hpp +1 -1
  965. data/src/cxx_supportlib/vendor-modified/boost/pool/simple_segregated_storage.hpp +13 -0
  966. data/src/cxx_supportlib/vendor-modified/boost/predef/library/std/msvc.h +53 -0
  967. data/src/cxx_supportlib/vendor-modified/boost/predef/library/std.h +1 -0
  968. data/src/cxx_supportlib/vendor-modified/boost/predef/make.h +4 -0
  969. data/src/cxx_supportlib/vendor-modified/boost/predef/os/vms.h +1 -1
  970. data/src/cxx_supportlib/vendor-modified/boost/predef/version.h +1 -1
  971. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/variadic/has_opt.hpp +2 -0
  972. data/src/cxx_supportlib/vendor-modified/boost/random/inversive_congruential.hpp +1 -1
  973. data/src/cxx_supportlib/vendor-modified/boost/random/splitmix64.hpp +203 -0
  974. data/src/cxx_supportlib/vendor-modified/boost/random/subtract_with_carry.hpp +14 -14
  975. data/src/cxx_supportlib/vendor-modified/boost/random/uniform_real_distribution.hpp +2 -2
  976. data/src/cxx_supportlib/vendor-modified/boost/random.hpp +1 -0
  977. data/src/cxx_supportlib/vendor-modified/boost/ratio/config.hpp +4 -82
  978. data/src/cxx_supportlib/vendor-modified/boost/ratio/detail/gcd_lcm.hpp +53 -0
  979. data/src/cxx_supportlib/vendor-modified/boost/ratio/detail/is_evenly_divisible_by.hpp +32 -0
  980. data/src/cxx_supportlib/vendor-modified/boost/ratio/detail/is_ratio.hpp +28 -0
  981. data/src/cxx_supportlib/vendor-modified/boost/ratio/include.hpp +1 -3
  982. data/src/cxx_supportlib/vendor-modified/boost/ratio/ratio.hpp +5 -249
  983. data/src/cxx_supportlib/vendor-modified/boost/ratio/ratio_fwd.hpp +30 -56
  984. data/src/cxx_supportlib/vendor-modified/boost/ratio/ratio_io.hpp +0 -533
  985. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_workaround.hpp +7 -7
  986. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/icu.hpp +9 -9
  987. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_workaround.hpp +7 -7
  988. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/allocate_shared_array.hpp +1 -0
  989. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/requires_cxx11.hpp +23 -0
  990. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_atomic.hpp +1 -1
  991. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/yield_k.hpp +4 -6
  992. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/enable_shared_from_this.hpp +1 -0
  993. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/intrusive_ptr.hpp +2 -11
  994. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/make_shared.hpp +1 -0
  995. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/make_shared_array.hpp +1 -0
  996. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/make_shared_object.hpp +1 -0
  997. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/make_unique.hpp +70 -0
  998. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/scoped_array.hpp +1 -0
  999. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/scoped_ptr.hpp +1 -0
  1000. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/shared_array.hpp +2 -0
  1001. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/shared_ptr.hpp +1 -11
  1002. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/weak_ptr.hpp +1 -0
  1003. data/src/cxx_supportlib/vendor-modified/boost/system/detail/config.hpp +4 -8
  1004. data/src/cxx_supportlib/vendor-modified/boost/system/detail/enable_if.hpp +3 -12
  1005. data/src/cxx_supportlib/vendor-modified/boost/system/detail/error_category.hpp +14 -50
  1006. data/src/cxx_supportlib/vendor-modified/boost/system/detail/error_category_impl.hpp +16 -55
  1007. data/src/cxx_supportlib/vendor-modified/boost/system/detail/error_code.hpp +62 -124
  1008. data/src/cxx_supportlib/vendor-modified/boost/system/detail/error_condition.hpp +29 -52
  1009. data/src/cxx_supportlib/vendor-modified/boost/system/detail/generic_category.hpp +7 -7
  1010. data/src/cxx_supportlib/vendor-modified/boost/system/detail/generic_category_message.hpp +4 -4
  1011. data/src/cxx_supportlib/vendor-modified/boost/system/detail/interop_category.hpp +7 -7
  1012. data/src/cxx_supportlib/vendor-modified/boost/system/detail/is_same.hpp +3 -13
  1013. data/src/cxx_supportlib/vendor-modified/boost/system/detail/mutex.hpp +128 -0
  1014. data/src/cxx_supportlib/vendor-modified/boost/system/detail/snprintf.hpp +1 -46
  1015. data/src/cxx_supportlib/vendor-modified/boost/system/detail/std_category.hpp +14 -13
  1016. data/src/cxx_supportlib/vendor-modified/boost/system/detail/std_category_impl.hpp +2 -2
  1017. data/src/cxx_supportlib/vendor-modified/boost/system/detail/system_category.hpp +7 -7
  1018. data/src/cxx_supportlib/vendor-modified/boost/system/detail/system_category_impl.hpp +3 -3
  1019. data/src/cxx_supportlib/vendor-modified/boost/system/detail/system_category_message.hpp +2 -2
  1020. data/src/cxx_supportlib/vendor-modified/boost/system/errc.hpp +3 -3
  1021. data/src/cxx_supportlib/vendor-modified/boost/system/system_error.hpp +1 -1
  1022. data/src/cxx_supportlib/vendor-modified/boost/thread/csbl/deque.hpp +1 -24
  1023. data/src/cxx_supportlib/vendor-modified/boost/thread/csbl/functional.hpp +1 -14
  1024. data/src/cxx_supportlib/vendor-modified/boost/thread/csbl/list.hpp +1 -14
  1025. data/src/cxx_supportlib/vendor-modified/boost/thread/csbl/memory/allocator_arg.hpp +2 -12
  1026. data/src/cxx_supportlib/vendor-modified/boost/thread/csbl/memory/allocator_traits.hpp +0 -11
  1027. data/src/cxx_supportlib/vendor-modified/boost/thread/csbl/memory/config.hpp +0 -2
  1028. data/src/cxx_supportlib/vendor-modified/boost/thread/csbl/memory/default_delete.hpp +0 -16
  1029. data/src/cxx_supportlib/vendor-modified/boost/thread/csbl/memory/pointer_traits.hpp +0 -11
  1030. data/src/cxx_supportlib/vendor-modified/boost/thread/csbl/memory/scoped_allocator.hpp +0 -11
  1031. data/src/cxx_supportlib/vendor-modified/boost/thread/csbl/memory/shared_ptr.hpp +0 -19
  1032. data/src/cxx_supportlib/vendor-modified/boost/thread/csbl/memory/unique_ptr.hpp +4 -6
  1033. data/src/cxx_supportlib/vendor-modified/boost/thread/csbl/queue.hpp +2 -26
  1034. data/src/cxx_supportlib/vendor-modified/boost/thread/csbl/tuple.hpp +1 -18
  1035. data/src/cxx_supportlib/vendor-modified/boost/thread/csbl/vector.hpp +1 -14
  1036. data/src/cxx_supportlib/vendor-modified/boost/thread/detail/invoke.hpp +11 -4
  1037. data/src/cxx_supportlib/vendor-modified/boost/thread/detail/string_to_unsigned.hpp +55 -0
  1038. data/src/cxx_supportlib/vendor-modified/boost/thread/detail/string_trim.hpp +29 -0
  1039. data/src/cxx_supportlib/vendor-modified/boost/thread/externally_locked.hpp +5 -5
  1040. data/src/cxx_supportlib/vendor-modified/boost/thread/future.hpp +0 -1
  1041. data/src/cxx_supportlib/vendor-modified/boost/thread/futures/wait_for_any.hpp +3 -2
  1042. data/src/cxx_supportlib/vendor-modified/boost/thread/synchronized_value.hpp +4 -4
  1043. data/src/cxx_supportlib/vendor-modified/boost/throw_exception.hpp +2 -2
  1044. data/src/cxx_supportlib/vendor-modified/boost/tuple/detail/tuple_basic.hpp +3 -3
  1045. data/src/cxx_supportlib/vendor-modified/boost/tuple/tuple.hpp +1 -1
  1046. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_swappable_cxx_11.hpp +70 -0
  1047. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_floating_point.hpp +22 -0
  1048. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_integral.hpp +3 -0
  1049. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_nothrow_swappable.hpp +4 -24
  1050. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_swappable.hpp +92 -0
  1051. data/src/cxx_supportlib/vendor-modified/boost/typeof/decltype.hpp +2 -3
  1052. data/src/cxx_supportlib/vendor-modified/boost/typeof/incr_registration_group.hpp +1 -10
  1053. data/src/cxx_supportlib/vendor-modified/boost/typeof/msvc/typeof_impl.hpp +5 -6
  1054. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/bitset.hpp +2 -4
  1055. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/complex.hpp +2 -4
  1056. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/deque.hpp +2 -5
  1057. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/fstream.hpp +2 -15
  1058. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/functional.hpp +4 -51
  1059. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/iostream.hpp +2 -6
  1060. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/istream.hpp +2 -9
  1061. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/iterator.hpp +2 -46
  1062. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/list.hpp +2 -5
  1063. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/locale.hpp +2 -29
  1064. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/map.hpp +2 -9
  1065. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/memory.hpp +4 -9
  1066. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/ostream.hpp +2 -6
  1067. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/queue.hpp +2 -5
  1068. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/set.hpp +2 -9
  1069. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/sstream.hpp +2 -19
  1070. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/stack.hpp +2 -5
  1071. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/streambuf.hpp +2 -5
  1072. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/string.hpp +2 -12
  1073. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/utility.hpp +2 -4
  1074. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/valarray.hpp +2 -10
  1075. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/vector.hpp +2 -5
  1076. data/src/cxx_supportlib/vendor-modified/boost/typeof/typeof.hpp +8 -202
  1077. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map.hpp +860 -0
  1078. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map_fwd.hpp +51 -0
  1079. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_set.hpp +716 -0
  1080. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_set_fwd.hpp +52 -0
  1081. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/allocator_constructed.hpp +59 -0
  1082. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/archive_constructed.hpp +71 -0
  1083. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/bad_archive_exception.hpp +27 -0
  1084. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/concurrent_static_asserts.hpp +105 -0
  1085. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/fca.hpp +120 -85
  1086. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/concurrent_table.hpp +1764 -0
  1087. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/core.hpp +2271 -0
  1088. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/element_type.hpp +64 -0
  1089. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/flat_map_types.hpp +86 -0
  1090. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/flat_set_types.hpp +44 -0
  1091. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/ignore_wshadow.hpp +35 -0
  1092. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/node_handle.hpp +204 -0
  1093. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/node_map_types.hpp +139 -0
  1094. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/node_set_types.hpp +92 -0
  1095. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/reentrancy_check.hpp +138 -0
  1096. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/restore_wshadow.hpp +11 -0
  1097. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/rw_spinlock.hpp +179 -0
  1098. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/table.hpp +651 -0
  1099. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/tuple_rotate_right.hpp +52 -0
  1100. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/implementation.hpp +356 -1118
  1101. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/map.hpp +2 -0
  1102. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/mulx.hpp +129 -0
  1103. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/narrow_cast.hpp +44 -0
  1104. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/opt_storage.hpp +30 -0
  1105. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/prime_fmod.hpp +96 -150
  1106. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/serialization_version.hpp +74 -0
  1107. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/serialize_container.hpp +204 -0
  1108. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/serialize_fca_container.hpp +156 -0
  1109. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/serialize_tracked_address.hpp +104 -0
  1110. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/static_assert.hpp +16 -0
  1111. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/throw_exception.hpp +30 -0
  1112. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/type_traits.hpp +136 -19
  1113. data/src/cxx_supportlib/vendor-modified/boost/unordered/hash_traits.hpp +4 -5
  1114. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map.hpp +171 -103
  1115. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map_fwd.hpp +1 -6
  1116. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set.hpp +70 -46
  1117. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set_fwd.hpp +1 -6
  1118. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_map.hpp +406 -899
  1119. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_map_fwd.hpp +7 -13
  1120. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map.hpp +895 -0
  1121. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map_fwd.hpp +44 -0
  1122. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set.hpp +699 -0
  1123. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set_fwd.hpp +44 -0
  1124. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_set.hpp +253 -618
  1125. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_set_fwd.hpp +8 -14
  1126. data/src/cxx_supportlib/vendor-modified/boost/utility/swap.hpp +4 -1
  1127. data/src/cxx_supportlib/vendor-modified/boost/utility/value_init.hpp +8 -8
  1128. data/src/cxx_supportlib/vendor-modified/boost/version.hpp +2 -2
  1129. data/src/cxx_supportlib/vendor-modified/jsoncpp/jsoncpp.cpp +2 -9
  1130. data/src/cxx_supportlib/vendor-modified/websocketpp/websocketpp/frame.hpp +0 -11
  1131. data/src/cxx_supportlib/vendor-modified/websocketpp/websocketpp/processors/hybi13.hpp +14 -20
  1132. data/src/helper-scripts/wsgi-loader.py +2 -2
  1133. data/src/nginx_module/ConfigGeneral/ManifestGeneration.c +2 -2
  1134. data/src/ruby_supportlib/phusion_passenger/common_library.rb +16 -5
  1135. data/src/ruby_supportlib/phusion_passenger/config/nginx_engine_compiler.rb +1 -1
  1136. data/src/ruby_supportlib/phusion_passenger/loader_shared_helpers.rb +3 -1
  1137. data/src/ruby_supportlib/phusion_passenger/native_support.rb +10 -7
  1138. data/src/ruby_supportlib/phusion_passenger/platform_info/apache.rb +8 -10
  1139. data/src/ruby_supportlib/phusion_passenger/platform_info/compiler.rb +14 -0
  1140. data/src/ruby_supportlib/phusion_passenger/platform_info/cxx_portability.rb +4 -1
  1141. data/src/ruby_supportlib/phusion_passenger/platform_info/depcheck_specs/libs.rb +6 -6
  1142. data/src/ruby_supportlib/phusion_passenger/platform_info/pcre.rb +11 -12
  1143. data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/app.rb +1 -1
  1144. data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/gdb_controller.rb +4 -0
  1145. data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/lldb_controller.rb +5 -1
  1146. data/src/ruby_supportlib/phusion_passenger.rb +8 -8
  1147. metadata +109 -150
  1148. data/src/cxx_supportlib/ServerKit/http_parser.cpp +0 -2265
  1149. data/src/cxx_supportlib/ServerKit/http_parser.h +0 -330
  1150. data/src/cxx_supportlib/vendor-modified/boost/array.hpp +0 -456
  1151. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/bulk_executor_op.hpp +0 -90
  1152. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/gcc_arm_fenced_block.hpp +0 -93
  1153. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/gcc_hppa_fenced_block.hpp +0 -70
  1154. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/gcc_sync_fenced_block.hpp +0 -67
  1155. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/gcc_x86_fenced_block.hpp +0 -101
  1156. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_invoke_helpers.hpp +0 -80
  1157. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/macos_fenced_block.hpp +0 -64
  1158. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/old_win_sdk_compat.hpp +0 -216
  1159. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/solaris_fenced_block.hpp +0 -64
  1160. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/variadic_templates.hpp +0 -294
  1161. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/bulk_execute.hpp +0 -406
  1162. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/bulk_guarantee.hpp +0 -1254
  1163. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/connect.hpp +0 -498
  1164. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/detail/as_invocable.hpp +0 -154
  1165. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/detail/as_operation.hpp +0 -111
  1166. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/detail/as_receiver.hpp +0 -130
  1167. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/detail/bulk_sender.hpp +0 -263
  1168. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/detail/submit_receiver.hpp +0 -235
  1169. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/detail/void_receiver.hpp +0 -92
  1170. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/execute.hpp +0 -296
  1171. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/impl/receiver_invocation_error.ipp +0 -38
  1172. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/operation_state.hpp +0 -101
  1173. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/receiver.hpp +0 -287
  1174. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/receiver_invocation_error.hpp +0 -50
  1175. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/schedule.hpp +0 -296
  1176. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/scheduler.hpp +0 -93
  1177. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/sender.hpp +0 -318
  1178. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/set_done.hpp +0 -259
  1179. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/set_error.hpp +0 -259
  1180. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/set_value.hpp +0 -492
  1181. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/start.hpp +0 -256
  1182. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/submit.hpp +0 -459
  1183. data/src/cxx_supportlib/vendor-modified/boost/asio/handler_alloc_hook.hpp +0 -106
  1184. data/src/cxx_supportlib/vendor-modified/boost/asio/handler_invoke_hook.hpp +0 -113
  1185. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/defer.hpp +0 -300
  1186. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/dispatch.hpp +0 -275
  1187. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/handler_alloc_hook.ipp +0 -64
  1188. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/post.hpp +0 -300
  1189. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/bulk_execute_free.hpp +0 -116
  1190. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/bulk_execute_member.hpp +0 -116
  1191. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/connect_free.hpp +0 -114
  1192. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/connect_member.hpp +0 -114
  1193. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/execute_free.hpp +0 -110
  1194. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/schedule_free.hpp +0 -110
  1195. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/schedule_member.hpp +0 -110
  1196. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/set_done_free.hpp +0 -110
  1197. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/set_done_member.hpp +0 -110
  1198. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/set_error_free.hpp +0 -114
  1199. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/set_error_member.hpp +0 -114
  1200. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/set_value_free.hpp +0 -236
  1201. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/set_value_member.hpp +0 -236
  1202. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/start_free.hpp +0 -110
  1203. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/start_member.hpp +0 -110
  1204. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/submit_free.hpp +0 -114
  1205. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/submit_member.hpp +0 -114
  1206. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/basic_object_handle.hpp +0 -495
  1207. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/basic_overlapped_handle.hpp +0 -462
  1208. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/basic_random_access_handle.hpp +0 -581
  1209. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/basic_stream_handle.hpp +0 -563
  1210. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/object_handle.hpp +0 -40
  1211. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/overlapped_handle.hpp +0 -41
  1212. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/overlapped_ptr.hpp +0 -147
  1213. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/random_access_handle.hpp +0 -39
  1214. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/stream_handle.hpp +0 -39
  1215. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_ops_windows.hpp +0 -201
  1216. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_ops_windows.hpp +0 -67
  1217. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/wait_caps_windows.hpp +0 -57
  1218. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/wait_ops_windows.hpp +0 -179
  1219. data/src/cxx_supportlib/vendor-modified/boost/bind/bind_mf2_cc.hpp +0 -228
  1220. data/src/cxx_supportlib/vendor-modified/boost/bind/bind_mf_cc.hpp +0 -441
  1221. data/src/cxx_supportlib/vendor-modified/boost/bind/bind_template.hpp +0 -345
  1222. data/src/cxx_supportlib/vendor-modified/boost/bind/mem_fn_cc.hpp +0 -103
  1223. data/src/cxx_supportlib/vendor-modified/boost/bind/mem_fn_template.hpp +0 -1047
  1224. data/src/cxx_supportlib/vendor-modified/boost/bind/mem_fn_vw.hpp +0 -130
  1225. data/src/cxx_supportlib/vendor-modified/boost/bind/storage.hpp +0 -475
  1226. data/src/cxx_supportlib/vendor-modified/boost/config/platform/cygwin.hpp +0 -71
  1227. data/src/cxx_supportlib/vendor-modified/boost/container/detail/hash_table.hpp +0 -1278
  1228. data/src/cxx_supportlib/vendor-modified/boost/container_hash/detail/hash_tuple.hpp +0 -133
  1229. data/src/cxx_supportlib/vendor-modified/boost/detail/atomic_count.hpp +0 -21
  1230. data/src/cxx_supportlib/vendor-modified/boost/function/detail/function_iterate.hpp +0 -16
  1231. data/src/cxx_supportlib/vendor-modified/boost/function/detail/gen_maybe_include.pl +0 -39
  1232. data/src/cxx_supportlib/vendor-modified/boost/function/detail/maybe_include.hpp +0 -369
  1233. data/src/cxx_supportlib/vendor-modified/boost/function/detail/prologue.hpp +0 -26
  1234. data/src/cxx_supportlib/vendor-modified/boost/function/gen_function_N.pl +0 -26
  1235. data/src/cxx_supportlib/vendor-modified/boost/functional/hash_fwd.hpp +0 -6
  1236. data/src/cxx_supportlib/vendor-modified/boost/ratio/detail/mpl/abs.hpp +0 -89
  1237. data/src/cxx_supportlib/vendor-modified/boost/ratio/detail/mpl/gcd.hpp +0 -124
  1238. data/src/cxx_supportlib/vendor-modified/boost/ratio/detail/mpl/lcm.hpp +0 -126
  1239. data/src/cxx_supportlib/vendor-modified/boost/ratio/detail/mpl/sign.hpp +0 -89
  1240. data/src/cxx_supportlib/vendor-modified/boost/ratio/detail/overflow_helpers.hpp +0 -367
  1241. data/src/cxx_supportlib/vendor-modified/boost/ratio/detail/ratio_io.hpp +0 -1342
  1242. data/src/cxx_supportlib/vendor-modified/boost/ratio/mpl/abs.hpp +0 -30
  1243. data/src/cxx_supportlib/vendor-modified/boost/ratio/mpl/arithmetic.hpp +0 -22
  1244. data/src/cxx_supportlib/vendor-modified/boost/ratio/mpl/comparison.hpp +0 -19
  1245. data/src/cxx_supportlib/vendor-modified/boost/ratio/mpl/divides.hpp +0 -30
  1246. data/src/cxx_supportlib/vendor-modified/boost/ratio/mpl/equal_to.hpp +0 -30
  1247. data/src/cxx_supportlib/vendor-modified/boost/ratio/mpl/gcd.hpp +0 -30
  1248. data/src/cxx_supportlib/vendor-modified/boost/ratio/mpl/greater.hpp +0 -30
  1249. data/src/cxx_supportlib/vendor-modified/boost/ratio/mpl/greater_equal.hpp +0 -30
  1250. data/src/cxx_supportlib/vendor-modified/boost/ratio/mpl/lcm.hpp +0 -30
  1251. data/src/cxx_supportlib/vendor-modified/boost/ratio/mpl/less.hpp +0 -30
  1252. data/src/cxx_supportlib/vendor-modified/boost/ratio/mpl/less_equal.hpp +0 -30
  1253. data/src/cxx_supportlib/vendor-modified/boost/ratio/mpl/minus.hpp +0 -30
  1254. data/src/cxx_supportlib/vendor-modified/boost/ratio/mpl/negate.hpp +0 -30
  1255. data/src/cxx_supportlib/vendor-modified/boost/ratio/mpl/not_equal_to.hpp +0 -30
  1256. data/src/cxx_supportlib/vendor-modified/boost/ratio/mpl/numeric_cast.hpp +0 -31
  1257. data/src/cxx_supportlib/vendor-modified/boost/ratio/mpl/plus.hpp +0 -30
  1258. data/src/cxx_supportlib/vendor-modified/boost/ratio/mpl/rational_c_tag.hpp +0 -25
  1259. data/src/cxx_supportlib/vendor-modified/boost/ratio/mpl/rational_constant.hpp +0 -15
  1260. data/src/cxx_supportlib/vendor-modified/boost/ratio/mpl/sign.hpp +0 -30
  1261. data/src/cxx_supportlib/vendor-modified/boost/ratio/mpl/times.hpp +0 -30
  1262. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_thread_pause.hpp +0 -51
  1263. data/src/cxx_supportlib/vendor-modified/boost/swap.hpp +0 -17
  1264. data/src/cxx_supportlib/vendor-modified/boost/type_index/stl_type_index.hpp +0 -278
  1265. data/src/cxx_supportlib/vendor-modified/boost/type_index/type_index_facade.hpp +0 -297
  1266. data/src/cxx_supportlib/vendor-modified/boost/type_index.hpp +0 -265
  1267. data/src/cxx_supportlib/vendor-modified/boost/typeof/dmc/typeof_impl.hpp +0 -100
  1268. data/src/cxx_supportlib/vendor-modified/boost/typeof/encode_decode.hpp +0 -58
  1269. data/src/cxx_supportlib/vendor-modified/boost/typeof/encode_decode_params.hpp +0 -34
  1270. data/src/cxx_supportlib/vendor-modified/boost/typeof/int_encoding.hpp +0 -118
  1271. data/src/cxx_supportlib/vendor-modified/boost/typeof/integral_template_param.hpp +0 -80
  1272. data/src/cxx_supportlib/vendor-modified/boost/typeof/message.hpp +0 -8
  1273. data/src/cxx_supportlib/vendor-modified/boost/typeof/modifiers.hpp +0 -121
  1274. data/src/cxx_supportlib/vendor-modified/boost/typeof/native.hpp +0 -60
  1275. data/src/cxx_supportlib/vendor-modified/boost/typeof/pointers_data_members.hpp +0 -38
  1276. data/src/cxx_supportlib/vendor-modified/boost/typeof/register_functions.hpp +0 -50
  1277. data/src/cxx_supportlib/vendor-modified/boost/typeof/register_functions_iterate.hpp +0 -135
  1278. data/src/cxx_supportlib/vendor-modified/boost/typeof/register_fundamental.hpp +0 -61
  1279. data/src/cxx_supportlib/vendor-modified/boost/typeof/register_mem_functions.hpp +0 -32
  1280. data/src/cxx_supportlib/vendor-modified/boost/typeof/template_encoding.hpp +0 -160
  1281. data/src/cxx_supportlib/vendor-modified/boost/typeof/template_template_param.hpp +0 -149
  1282. data/src/cxx_supportlib/vendor-modified/boost/typeof/type_encoding.hpp +0 -27
  1283. data/src/cxx_supportlib/vendor-modified/boost/typeof/type_template_param.hpp +0 -37
  1284. data/src/cxx_supportlib/vendor-modified/boost/typeof/typeof_impl.hpp +0 -187
  1285. data/src/cxx_supportlib/vendor-modified/boost/typeof/unsupported.hpp +0 -29
  1286. data/src/cxx_supportlib/vendor-modified/boost/typeof/vector.hpp +0 -166
  1287. data/src/cxx_supportlib/vendor-modified/boost/typeof/vector100.hpp +0 -321
  1288. data/src/cxx_supportlib/vendor-modified/boost/typeof/vector150.hpp +0 -471
  1289. data/src/cxx_supportlib/vendor-modified/boost/typeof/vector200.hpp +0 -621
  1290. data/src/cxx_supportlib/vendor-modified/boost/typeof/vector50.hpp +0 -171
  1291. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa.hpp +0 -1921
  1292. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/fwd.hpp +0 -64
  1293. /data/dev/{webpacketpp.patch → websocketpp.patch} +0 -0
@@ -0,0 +1,2271 @@
1
+ /* Common base for Boost.Unordered open-addressing tables.
2
+ *
3
+ * Copyright 2022-2024 Joaquin M Lopez Munoz.
4
+ * Copyright 2023 Christian Mazakas.
5
+ * Copyright 2024 Braden Ganetsky.
6
+ * Distributed under the Boost Software License, Version 1.0.
7
+ * (See accompanying file LICENSE_1_0.txt or copy at
8
+ * http://www.boost.org/LICENSE_1_0.txt)
9
+ *
10
+ * See https://www.boost.org/libs/unordered for library home page.
11
+ */
12
+
13
+ #ifndef BOOST_UNORDERED_DETAIL_FOA_CORE_HPP
14
+ #define BOOST_UNORDERED_DETAIL_FOA_CORE_HPP
15
+
16
+ #include <boost/assert.hpp>
17
+ #include <boost/config.hpp>
18
+ #include <boost/config/workaround.hpp>
19
+ #include <boost/core/allocator_traits.hpp>
20
+ #include <boost/core/bit.hpp>
21
+ #include <boost/core/empty_value.hpp>
22
+ #include <boost/core/no_exceptions_support.hpp>
23
+ #include <boost/core/pointer_traits.hpp>
24
+ #include <boost/cstdint.hpp>
25
+ #include <boost/predef.h>
26
+ #include <boost/unordered/detail/allocator_constructed.hpp>
27
+ #include <boost/unordered/detail/narrow_cast.hpp>
28
+ #include <boost/unordered/detail/mulx.hpp>
29
+ #include <boost/unordered/detail/static_assert.hpp>
30
+ #include <boost/unordered/detail/type_traits.hpp>
31
+ #include <boost/unordered/hash_traits.hpp>
32
+ #include <climits>
33
+ #include <cmath>
34
+ #include <cstddef>
35
+ #include <cstring>
36
+ #include <limits>
37
+ #include <memory>
38
+ #include <new>
39
+ #include <tuple>
40
+ #include <type_traits>
41
+ #include <utility>
42
+
43
+ #if !defined(BOOST_UNORDERED_DISABLE_SSE2)
44
+ #if defined(BOOST_UNORDERED_ENABLE_SSE2)|| \
45
+ defined(__SSE2__)|| \
46
+ defined(_M_X64)||(defined(_M_IX86_FP)&&_M_IX86_FP>=2)
47
+ #define BOOST_UNORDERED_SSE2
48
+ #endif
49
+ #endif
50
+
51
+ #if !defined(BOOST_UNORDERED_DISABLE_NEON)
52
+ #if defined(BOOST_UNORDERED_ENABLE_NEON)||\
53
+ (defined(__ARM_NEON)&&!defined(__ARM_BIG_ENDIAN))
54
+ #define BOOST_UNORDERED_LITTLE_ENDIAN_NEON
55
+ #endif
56
+ #endif
57
+
58
+ #if defined(BOOST_UNORDERED_SSE2)
59
+ #include <emmintrin.h>
60
+ #elif defined(BOOST_UNORDERED_LITTLE_ENDIAN_NEON)
61
+ #include <arm_neon.h>
62
+ #endif
63
+
64
+ #ifdef __has_builtin
65
+ #define BOOST_UNORDERED_HAS_BUILTIN(x) __has_builtin(x)
66
+ #else
67
+ #define BOOST_UNORDERED_HAS_BUILTIN(x) 0
68
+ #endif
69
+
70
+ #if !defined(NDEBUG)
71
+ #define BOOST_UNORDERED_ASSUME(cond) BOOST_ASSERT(cond)
72
+ #elif BOOST_UNORDERED_HAS_BUILTIN(__builtin_assume)
73
+ #define BOOST_UNORDERED_ASSUME(cond) __builtin_assume(cond)
74
+ #elif defined(__GNUC__) || BOOST_UNORDERED_HAS_BUILTIN(__builtin_unreachable)
75
+ #define BOOST_UNORDERED_ASSUME(cond) \
76
+ do{ \
77
+ if(!(cond))__builtin_unreachable(); \
78
+ }while(0)
79
+ #elif defined(_MSC_VER)
80
+ #define BOOST_UNORDERED_ASSUME(cond) __assume(cond)
81
+ #else
82
+ #define BOOST_UNORDERED_ASSUME(cond) \
83
+ do{ \
84
+ static_cast<void>(false&&(cond)); \
85
+ }while(0)
86
+ #endif
87
+
88
+ /* We use BOOST_UNORDERED_PREFETCH[_ELEMENTS] macros rather than proper
89
+ * functions because of https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109985
90
+ */
91
+
92
+ #if defined(BOOST_GCC)||defined(BOOST_CLANG)
93
+ #define BOOST_UNORDERED_PREFETCH(p) __builtin_prefetch((const char*)(p))
94
+ #elif defined(BOOST_UNORDERED_SSE2)
95
+ #define BOOST_UNORDERED_PREFETCH(p) _mm_prefetch((const char*)(p),_MM_HINT_T0)
96
+ #else
97
+ #define BOOST_UNORDERED_PREFETCH(p) ((void)(p))
98
+ #endif
99
+
100
+ /* We have experimentally confirmed that ARM architectures get a higher
101
+ * speedup when around the first half of the element slots in a group are
102
+ * prefetched, whereas for Intel just the first cache line is best.
103
+ * Please report back if you find better tunings for some particular
104
+ * architectures.
105
+ */
106
+
107
+ #if BOOST_ARCH_ARM
108
+ /* Cache line size can't be known at compile time, so we settle on
109
+ * the very frequent value of 64B.
110
+ */
111
+
112
+ #define BOOST_UNORDERED_PREFETCH_ELEMENTS(p,N) \
113
+ do{ \
114
+ auto BOOST_UNORDERED_P=(p); \
115
+ constexpr int cache_line=64; \
116
+ const char *p0=reinterpret_cast<const char*>(BOOST_UNORDERED_P), \
117
+ *p1=p0+sizeof(*BOOST_UNORDERED_P)*(N)/2; \
118
+ for(;p0<p1;p0+=cache_line)BOOST_UNORDERED_PREFETCH(p0); \
119
+ }while(0)
120
+ #else
121
+ #define BOOST_UNORDERED_PREFETCH_ELEMENTS(p,N) BOOST_UNORDERED_PREFETCH(p)
122
+ #endif
123
+
124
+ #ifdef __has_feature
125
+ #define BOOST_UNORDERED_HAS_FEATURE(x) __has_feature(x)
126
+ #else
127
+ #define BOOST_UNORDERED_HAS_FEATURE(x) 0
128
+ #endif
129
+
130
+ #if BOOST_UNORDERED_HAS_FEATURE(thread_sanitizer)|| \
131
+ defined(__SANITIZE_THREAD__)
132
+ #define BOOST_UNORDERED_THREAD_SANITIZER
133
+ #endif
134
+
135
+ #define BOOST_UNORDERED_STATIC_ASSERT_HASH_PRED(Hash, Pred) \
136
+ static_assert(boost::unordered::detail::is_nothrow_swappable<Hash>::value, \
137
+ "Template parameter Hash is required to be nothrow Swappable."); \
138
+ static_assert(boost::unordered::detail::is_nothrow_swappable<Pred>::value, \
139
+ "Template parameter Pred is required to be nothrow Swappable");
140
+
141
+ namespace boost{
142
+ namespace unordered{
143
+ namespace detail{
144
+ namespace foa{
145
+
146
+ static constexpr std::size_t default_bucket_count=0;
147
+
148
+ /* foa::table_core is the common base of foa::table and foa::concurrent_table,
149
+ * which in their turn serve as the foundational core of
150
+ * boost::unordered_(flat|node)_(map|set) and boost::concurrent_flat_(map|set),
151
+ * respectively. Its main internal design aspects are:
152
+ *
153
+ * - Element slots are logically split into groups of size N=15. The number
154
+ * of groups is always a power of two, so the number of allocated slots
155
+ is of the form (N*2^n)-1 (final slot reserved for a sentinel mark).
156
+ * - Positioning is done at the group level rather than the slot level, that
157
+ * is, for any given element its hash value is used to locate a group and
158
+ * insertion is performed on the first available element of that group;
159
+ * if the group is full (overflow), further groups are tried using
160
+ * quadratic probing.
161
+ * - Each group has an associated 16B metadata word holding reduced hash
162
+ * values and overflow information. Reduced hash values are used to
163
+ * accelerate lookup within the group by using 128-bit SIMD or 64-bit word
164
+ * operations.
165
+ */
166
+
167
+ /* group15 controls metadata information of a group of N=15 element slots.
168
+ * The 16B metadata word is organized as follows (LSB depicted rightmost):
169
+ *
170
+ * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
171
+ * |ofw|h14|h13|h13|h11|h10|h09|h08|h07|h06|h05|h04|h03|h02|h01|h00|
172
+ * +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
173
+ *
174
+ * hi is 0 if the i-th element slot is avalaible, 1 to mark a sentinel and,
175
+ * when the slot is occupied, a value in the range [2,255] obtained from the
176
+ * element's original hash value.
177
+ * ofw is the so-called overflow byte. If insertion of an element with hash
178
+ * value h is tried on a full group, then the (h%8)-th bit of the overflow
179
+ * byte is set to 1 and a further group is probed. Having an overflow byte
180
+ * brings two advantages:
181
+ *
182
+ * - There's no need to reserve a special value of hi to mark tombstone
183
+ * slots; each reduced hash value keeps then log2(254)=7.99 bits of the
184
+ * original hash (alternative approaches reserve one full bit to mark
185
+ * if the slot is available/deleted, so their reduced hash values are 7 bit
186
+ * strong only).
187
+ * - When doing an unsuccessful lookup (i.e. the element is not present in
188
+ * the table), probing stops at the first non-overflowed group. Having 8
189
+ * bits for signalling overflow makes it very likely that we stop at the
190
+ * current group (this happens when no element with the same (h%8) value
191
+ * has overflowed in the group), saving us an additional group check even
192
+ * under high-load/high-erase conditions. It is critical that hash
193
+ * reduction is invariant under modulo 8 (see maybe_caused_overflow).
194
+ *
195
+ * When looking for an element with hash value h, match(h) returns a bitmask
196
+ * signalling which slots have the same reduced hash value. If available,
197
+ * match uses SSE2 or (little endian) Neon 128-bit SIMD operations. On non-SIMD
198
+ * scenarios, the logical layout described above is physically mapped to two
199
+ * 64-bit words with *bit interleaving*, i.e. the least significant 16 bits of
200
+ * the first 64-bit word contain the least significant bits of each byte in the
201
+ * "logical" 128-bit word, and so forth. With this layout, match can be
202
+ * implemented with 4 ANDs, 3 shifts, 2 XORs, 1 OR and 1 NOT.
203
+ *
204
+ * IntegralWrapper<Integral> is used to implement group15's underlying
205
+ * metadata: it behaves as a plain integral for foa::table or introduces
206
+ * atomic ops for foa::concurrent_table. If IntegralWrapper<...> is trivially
207
+ * constructible, so is group15, in which case it can be initialized via memset
208
+ * etc. Where needed, group15::initialize resets the metadata to the all
209
+ * zeros (default state).
210
+ */
211
+
212
+ #if defined(BOOST_UNORDERED_SSE2)
213
+
214
+ template<template<typename> class IntegralWrapper>
215
+ struct group15
216
+ {
217
+ static constexpr std::size_t N=15;
218
+ static constexpr bool regular_layout=true;
219
+
220
+ struct dummy_group_type
221
+ {
222
+ alignas(16) unsigned char storage[N+1]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0};
223
+ };
224
+
225
+ inline void initialize()
226
+ {
227
+ _mm_store_si128(
228
+ reinterpret_cast<__m128i*>(m),_mm_setzero_si128());
229
+ }
230
+
231
+ inline void set(std::size_t pos,std::size_t hash)
232
+ {
233
+ BOOST_ASSERT(pos<N);
234
+ at(pos)=reduced_hash(hash);
235
+ }
236
+
237
+ inline void set_sentinel()
238
+ {
239
+ at(N-1)=sentinel_;
240
+ }
241
+
242
+ inline bool is_sentinel(std::size_t pos)const
243
+ {
244
+ BOOST_ASSERT(pos<N);
245
+ return at(pos)==sentinel_;
246
+ }
247
+
248
+ static inline bool is_sentinel(unsigned char* pc)noexcept
249
+ {
250
+ return *pc==sentinel_;
251
+ }
252
+
253
+ inline void reset(std::size_t pos)
254
+ {
255
+ BOOST_ASSERT(pos<N);
256
+ at(pos)=available_;
257
+ }
258
+
259
+ static inline void reset(unsigned char* pc)
260
+ {
261
+ *reinterpret_cast<slot_type*>(pc)=available_;
262
+ }
263
+
264
+ inline int match(std::size_t hash)const
265
+ {
266
+ return _mm_movemask_epi8(
267
+ _mm_cmpeq_epi8(load_metadata(),_mm_set1_epi32(match_word(hash))))&0x7FFF;
268
+ }
269
+
270
+ inline bool is_not_overflowed(std::size_t hash)const
271
+ {
272
+ static constexpr unsigned char shift[]={1,2,4,8,16,32,64,128};
273
+
274
+ return !(overflow()&shift[hash%8]);
275
+ }
276
+
277
+ inline void mark_overflow(std::size_t hash)
278
+ {
279
+ overflow()|=static_cast<unsigned char>(1<<(hash%8));
280
+ }
281
+
282
+ static inline bool maybe_caused_overflow(unsigned char* pc)
283
+ {
284
+ std::size_t pos=reinterpret_cast<uintptr_t>(pc)%sizeof(group15);
285
+ group15 *pg=reinterpret_cast<group15*>(pc-pos);
286
+ return !pg->is_not_overflowed(*pc);
287
+ }
288
+
289
+ inline int match_available()const
290
+ {
291
+ return _mm_movemask_epi8(
292
+ _mm_cmpeq_epi8(load_metadata(),_mm_setzero_si128()))&0x7FFF;
293
+ }
294
+
295
+ inline bool is_occupied(std::size_t pos)const
296
+ {
297
+ BOOST_ASSERT(pos<N);
298
+ return at(pos)!=available_;
299
+ }
300
+
301
+ static inline bool is_occupied(unsigned char* pc)noexcept
302
+ {
303
+ return *reinterpret_cast<slot_type*>(pc)!=available_;
304
+ }
305
+
306
+ inline int match_occupied()const
307
+ {
308
+ return (~match_available())&0x7FFF;
309
+ }
310
+
311
+ private:
312
+ using slot_type=IntegralWrapper<unsigned char>;
313
+ BOOST_UNORDERED_STATIC_ASSERT(sizeof(slot_type)==1);
314
+
315
+ static constexpr unsigned char available_=0,
316
+ sentinel_=1;
317
+
318
+ inline __m128i load_metadata()const
319
+ {
320
+ #if defined(BOOST_UNORDERED_THREAD_SANITIZER)
321
+ /* ThreadSanitizer complains on 1-byte atomic writes combined with
322
+ * 16-byte atomic reads.
323
+ */
324
+
325
+ return _mm_set_epi8(
326
+ (char)m[15],(char)m[14],(char)m[13],(char)m[12],
327
+ (char)m[11],(char)m[10],(char)m[ 9],(char)m[ 8],
328
+ (char)m[ 7],(char)m[ 6],(char)m[ 5],(char)m[ 4],
329
+ (char)m[ 3],(char)m[ 2],(char)m[ 1],(char)m[ 0]);
330
+ #else
331
+ return _mm_load_si128(reinterpret_cast<const __m128i*>(m));
332
+ #endif
333
+ }
334
+
335
+ inline static int match_word(std::size_t hash)
336
+ {
337
+ static constexpr boost::uint32_t word[]=
338
+ {
339
+ 0x08080808u,0x09090909u,0x02020202u,0x03030303u,0x04040404u,0x05050505u,
340
+ 0x06060606u,0x07070707u,0x08080808u,0x09090909u,0x0A0A0A0Au,0x0B0B0B0Bu,
341
+ 0x0C0C0C0Cu,0x0D0D0D0Du,0x0E0E0E0Eu,0x0F0F0F0Fu,0x10101010u,0x11111111u,
342
+ 0x12121212u,0x13131313u,0x14141414u,0x15151515u,0x16161616u,0x17171717u,
343
+ 0x18181818u,0x19191919u,0x1A1A1A1Au,0x1B1B1B1Bu,0x1C1C1C1Cu,0x1D1D1D1Du,
344
+ 0x1E1E1E1Eu,0x1F1F1F1Fu,0x20202020u,0x21212121u,0x22222222u,0x23232323u,
345
+ 0x24242424u,0x25252525u,0x26262626u,0x27272727u,0x28282828u,0x29292929u,
346
+ 0x2A2A2A2Au,0x2B2B2B2Bu,0x2C2C2C2Cu,0x2D2D2D2Du,0x2E2E2E2Eu,0x2F2F2F2Fu,
347
+ 0x30303030u,0x31313131u,0x32323232u,0x33333333u,0x34343434u,0x35353535u,
348
+ 0x36363636u,0x37373737u,0x38383838u,0x39393939u,0x3A3A3A3Au,0x3B3B3B3Bu,
349
+ 0x3C3C3C3Cu,0x3D3D3D3Du,0x3E3E3E3Eu,0x3F3F3F3Fu,0x40404040u,0x41414141u,
350
+ 0x42424242u,0x43434343u,0x44444444u,0x45454545u,0x46464646u,0x47474747u,
351
+ 0x48484848u,0x49494949u,0x4A4A4A4Au,0x4B4B4B4Bu,0x4C4C4C4Cu,0x4D4D4D4Du,
352
+ 0x4E4E4E4Eu,0x4F4F4F4Fu,0x50505050u,0x51515151u,0x52525252u,0x53535353u,
353
+ 0x54545454u,0x55555555u,0x56565656u,0x57575757u,0x58585858u,0x59595959u,
354
+ 0x5A5A5A5Au,0x5B5B5B5Bu,0x5C5C5C5Cu,0x5D5D5D5Du,0x5E5E5E5Eu,0x5F5F5F5Fu,
355
+ 0x60606060u,0x61616161u,0x62626262u,0x63636363u,0x64646464u,0x65656565u,
356
+ 0x66666666u,0x67676767u,0x68686868u,0x69696969u,0x6A6A6A6Au,0x6B6B6B6Bu,
357
+ 0x6C6C6C6Cu,0x6D6D6D6Du,0x6E6E6E6Eu,0x6F6F6F6Fu,0x70707070u,0x71717171u,
358
+ 0x72727272u,0x73737373u,0x74747474u,0x75757575u,0x76767676u,0x77777777u,
359
+ 0x78787878u,0x79797979u,0x7A7A7A7Au,0x7B7B7B7Bu,0x7C7C7C7Cu,0x7D7D7D7Du,
360
+ 0x7E7E7E7Eu,0x7F7F7F7Fu,0x80808080u,0x81818181u,0x82828282u,0x83838383u,
361
+ 0x84848484u,0x85858585u,0x86868686u,0x87878787u,0x88888888u,0x89898989u,
362
+ 0x8A8A8A8Au,0x8B8B8B8Bu,0x8C8C8C8Cu,0x8D8D8D8Du,0x8E8E8E8Eu,0x8F8F8F8Fu,
363
+ 0x90909090u,0x91919191u,0x92929292u,0x93939393u,0x94949494u,0x95959595u,
364
+ 0x96969696u,0x97979797u,0x98989898u,0x99999999u,0x9A9A9A9Au,0x9B9B9B9Bu,
365
+ 0x9C9C9C9Cu,0x9D9D9D9Du,0x9E9E9E9Eu,0x9F9F9F9Fu,0xA0A0A0A0u,0xA1A1A1A1u,
366
+ 0xA2A2A2A2u,0xA3A3A3A3u,0xA4A4A4A4u,0xA5A5A5A5u,0xA6A6A6A6u,0xA7A7A7A7u,
367
+ 0xA8A8A8A8u,0xA9A9A9A9u,0xAAAAAAAAu,0xABABABABu,0xACACACACu,0xADADADADu,
368
+ 0xAEAEAEAEu,0xAFAFAFAFu,0xB0B0B0B0u,0xB1B1B1B1u,0xB2B2B2B2u,0xB3B3B3B3u,
369
+ 0xB4B4B4B4u,0xB5B5B5B5u,0xB6B6B6B6u,0xB7B7B7B7u,0xB8B8B8B8u,0xB9B9B9B9u,
370
+ 0xBABABABAu,0xBBBBBBBBu,0xBCBCBCBCu,0xBDBDBDBDu,0xBEBEBEBEu,0xBFBFBFBFu,
371
+ 0xC0C0C0C0u,0xC1C1C1C1u,0xC2C2C2C2u,0xC3C3C3C3u,0xC4C4C4C4u,0xC5C5C5C5u,
372
+ 0xC6C6C6C6u,0xC7C7C7C7u,0xC8C8C8C8u,0xC9C9C9C9u,0xCACACACAu,0xCBCBCBCBu,
373
+ 0xCCCCCCCCu,0xCDCDCDCDu,0xCECECECEu,0xCFCFCFCFu,0xD0D0D0D0u,0xD1D1D1D1u,
374
+ 0xD2D2D2D2u,0xD3D3D3D3u,0xD4D4D4D4u,0xD5D5D5D5u,0xD6D6D6D6u,0xD7D7D7D7u,
375
+ 0xD8D8D8D8u,0xD9D9D9D9u,0xDADADADAu,0xDBDBDBDBu,0xDCDCDCDCu,0xDDDDDDDDu,
376
+ 0xDEDEDEDEu,0xDFDFDFDFu,0xE0E0E0E0u,0xE1E1E1E1u,0xE2E2E2E2u,0xE3E3E3E3u,
377
+ 0xE4E4E4E4u,0xE5E5E5E5u,0xE6E6E6E6u,0xE7E7E7E7u,0xE8E8E8E8u,0xE9E9E9E9u,
378
+ 0xEAEAEAEAu,0xEBEBEBEBu,0xECECECECu,0xEDEDEDEDu,0xEEEEEEEEu,0xEFEFEFEFu,
379
+ 0xF0F0F0F0u,0xF1F1F1F1u,0xF2F2F2F2u,0xF3F3F3F3u,0xF4F4F4F4u,0xF5F5F5F5u,
380
+ 0xF6F6F6F6u,0xF7F7F7F7u,0xF8F8F8F8u,0xF9F9F9F9u,0xFAFAFAFAu,0xFBFBFBFBu,
381
+ 0xFCFCFCFCu,0xFDFDFDFDu,0xFEFEFEFEu,0xFFFFFFFFu,
382
+ };
383
+
384
+ return (int)word[narrow_cast<unsigned char>(hash)];
385
+ }
386
+
387
+ inline static unsigned char reduced_hash(std::size_t hash)
388
+ {
389
+ return narrow_cast<unsigned char>(match_word(hash));
390
+ }
391
+
392
+ inline slot_type& at(std::size_t pos)
393
+ {
394
+ return m[pos];
395
+ }
396
+
397
+ inline const slot_type& at(std::size_t pos)const
398
+ {
399
+ return m[pos];
400
+ }
401
+
402
+ inline slot_type& overflow()
403
+ {
404
+ return at(N);
405
+ }
406
+
407
+ inline const slot_type& overflow()const
408
+ {
409
+ return at(N);
410
+ }
411
+
412
+ alignas(16) slot_type m[16];
413
+ };
414
+
415
+ #elif defined(BOOST_UNORDERED_LITTLE_ENDIAN_NEON)
416
+
417
+ template<template<typename> class IntegralWrapper>
418
+ struct group15
419
+ {
420
+ static constexpr std::size_t N=15;
421
+ static constexpr bool regular_layout=true;
422
+
423
+ struct dummy_group_type
424
+ {
425
+ alignas(16) unsigned char storage[N+1]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0};
426
+ };
427
+
428
+ inline void initialize()
429
+ {
430
+ vst1q_u8(reinterpret_cast<uint8_t*>(m),vdupq_n_u8(0));
431
+ }
432
+
433
+ inline void set(std::size_t pos,std::size_t hash)
434
+ {
435
+ BOOST_ASSERT(pos<N);
436
+ at(pos)=reduced_hash(hash);
437
+ }
438
+
439
+ inline void set_sentinel()
440
+ {
441
+ at(N-1)=sentinel_;
442
+ }
443
+
444
+ inline bool is_sentinel(std::size_t pos)const
445
+ {
446
+ BOOST_ASSERT(pos<N);
447
+ return pos==N-1&&at(N-1)==sentinel_;
448
+ }
449
+
450
+ static inline bool is_sentinel(unsigned char* pc)noexcept
451
+ {
452
+ return *reinterpret_cast<slot_type*>(pc)==sentinel_;
453
+ }
454
+
455
+ inline void reset(std::size_t pos)
456
+ {
457
+ BOOST_ASSERT(pos<N);
458
+ at(pos)=available_;
459
+ }
460
+
461
+ static inline void reset(unsigned char* pc)
462
+ {
463
+ *reinterpret_cast<slot_type*>(pc)=available_;
464
+ }
465
+
466
+ inline int match(std::size_t hash)const
467
+ {
468
+ return simde_mm_movemask_epi8(vceqq_u8(
469
+ load_metadata(),vdupq_n_u8(reduced_hash(hash))))&0x7FFF;
470
+ }
471
+
472
+ inline bool is_not_overflowed(std::size_t hash)const
473
+ {
474
+ static constexpr unsigned char shift[]={1,2,4,8,16,32,64,128};
475
+
476
+ return !(overflow()&shift[hash%8]);
477
+ }
478
+
479
+ inline void mark_overflow(std::size_t hash)
480
+ {
481
+ overflow()|=static_cast<unsigned char>(1<<(hash%8));
482
+ }
483
+
484
+ static inline bool maybe_caused_overflow(unsigned char* pc)
485
+ {
486
+ std::size_t pos=reinterpret_cast<uintptr_t>(pc)%sizeof(group15);
487
+ group15 *pg=reinterpret_cast<group15*>(pc-pos);
488
+ return !pg->is_not_overflowed(*pc);
489
+ };
490
+
491
+ inline int match_available()const
492
+ {
493
+ return simde_mm_movemask_epi8(vceqq_u8(
494
+ load_metadata(),vdupq_n_u8(0)))&0x7FFF;
495
+ }
496
+
497
+ inline bool is_occupied(std::size_t pos)const
498
+ {
499
+ BOOST_ASSERT(pos<N);
500
+ return at(pos)!=available_;
501
+ }
502
+
503
+ static inline bool is_occupied(unsigned char* pc)noexcept
504
+ {
505
+ return *reinterpret_cast<slot_type*>(pc)!=available_;
506
+ }
507
+
508
+ inline int match_occupied()const
509
+ {
510
+ return simde_mm_movemask_epi8(vcgtq_u8(
511
+ load_metadata(),vdupq_n_u8(0)))&0x7FFF;
512
+ }
513
+
514
+ private:
515
+ using slot_type=IntegralWrapper<unsigned char>;
516
+ BOOST_UNORDERED_STATIC_ASSERT(sizeof(slot_type)==1);
517
+
518
+ static constexpr unsigned char available_=0,
519
+ sentinel_=1;
520
+
521
+ inline uint8x16_t load_metadata()const
522
+ {
523
+ #if defined(BOOST_UNORDERED_THREAD_SANITIZER)
524
+ /* ThreadSanitizer complains on 1-byte atomic writes combined with
525
+ * 16-byte atomic reads.
526
+ */
527
+
528
+ alignas(16) uint8_t data[16]={
529
+ m[ 0],m[ 1],m[ 2],m[ 3],m[ 4],m[ 5],m[ 6],m[ 7],
530
+ m[ 8],m[ 9],m[10],m[11],m[12],m[13],m[14],m[15]};
531
+ return vld1q_u8(data);
532
+ #else
533
+ return vld1q_u8(reinterpret_cast<const uint8_t*>(m));
534
+ #endif
535
+ }
536
+
537
+ inline static unsigned char reduced_hash(std::size_t hash)
538
+ {
539
+ static constexpr unsigned char table[]={
540
+ 8,9,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
541
+ 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
542
+ 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
543
+ 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
544
+ 64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
545
+ 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
546
+ 96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
547
+ 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
548
+ 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
549
+ 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
550
+ 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
551
+ 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
552
+ 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
553
+ 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
554
+ 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
555
+ 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,
556
+ };
557
+
558
+ return table[(unsigned char)hash];
559
+ }
560
+
561
+ /* Copied from
562
+ * https://github.com/simd-everywhere/simde/blob/master/simde/x86/
563
+ * sse2.h#L3763
564
+ */
565
+
566
+ static inline int simde_mm_movemask_epi8(uint8x16_t a)
567
+ {
568
+ static constexpr uint8_t md[16]={
569
+ 1 << 0, 1 << 1, 1 << 2, 1 << 3,
570
+ 1 << 4, 1 << 5, 1 << 6, 1 << 7,
571
+ 1 << 0, 1 << 1, 1 << 2, 1 << 3,
572
+ 1 << 4, 1 << 5, 1 << 6, 1 << 7,
573
+ };
574
+
575
+ uint8x16_t masked=vandq_u8(vld1q_u8(md),a);
576
+ uint8x8x2_t tmp=vzip_u8(vget_low_u8(masked),vget_high_u8(masked));
577
+ uint16x8_t x=vreinterpretq_u16_u8(vcombine_u8(tmp.val[0],tmp.val[1]));
578
+
579
+ #if defined(__ARM_ARCH_ISA_A64)
580
+ return vaddvq_u16(x);
581
+ #else
582
+ uint64x2_t t64=vpaddlq_u32(vpaddlq_u16(x));
583
+ return int(vgetq_lane_u64(t64,0))+int(vgetq_lane_u64(t64,1));
584
+ #endif
585
+ }
586
+
587
+ inline slot_type& at(std::size_t pos)
588
+ {
589
+ return m[pos];
590
+ }
591
+
592
+ inline const slot_type& at(std::size_t pos)const
593
+ {
594
+ return m[pos];
595
+ }
596
+
597
+ inline slot_type& overflow()
598
+ {
599
+ return at(N);
600
+ }
601
+
602
+ inline const slot_type& overflow()const
603
+ {
604
+ return at(N);
605
+ }
606
+
607
+ alignas(16) slot_type m[16];
608
+ };
609
+
610
+ #else /* non-SIMD */
611
+
612
+ template<template<typename> class IntegralWrapper>
613
+ struct group15
614
+ {
615
+ static constexpr std::size_t N=15;
616
+ static constexpr bool regular_layout=false;
617
+
618
+ struct dummy_group_type
619
+ {
620
+ alignas(16) boost::uint64_t m[2]=
621
+ {0x0000000000004000ull,0x0000000000000000ull};
622
+ };
623
+
624
+ inline void initialize(){m[0]=0;m[1]=0;}
625
+
626
+ inline void set(std::size_t pos,std::size_t hash)
627
+ {
628
+ BOOST_ASSERT(pos<N);
629
+ set_impl(pos,reduced_hash(hash));
630
+ }
631
+
632
+ inline void set_sentinel()
633
+ {
634
+ set_impl(N-1,sentinel_);
635
+ }
636
+
637
+ inline bool is_sentinel(std::size_t pos)const
638
+ {
639
+ BOOST_ASSERT(pos<N);
640
+ return
641
+ pos==N-1&&
642
+ (m[0] & boost::uint64_t(0x4000400040004000ull))==
643
+ boost::uint64_t(0x4000ull)&&
644
+ (m[1] & boost::uint64_t(0x4000400040004000ull))==0;
645
+ }
646
+
647
+ inline void reset(std::size_t pos)
648
+ {
649
+ BOOST_ASSERT(pos<N);
650
+ set_impl(pos,available_);
651
+ }
652
+
653
+ static inline void reset(unsigned char* pc)
654
+ {
655
+ std::size_t pos=reinterpret_cast<uintptr_t>(pc)%sizeof(group15);
656
+ pc-=pos;
657
+ reinterpret_cast<group15*>(pc)->reset(pos);
658
+ }
659
+
660
+ inline int match(std::size_t hash)const
661
+ {
662
+ return match_impl(reduced_hash(hash));
663
+ }
664
+
665
+ inline bool is_not_overflowed(std::size_t hash)const
666
+ {
667
+ return !(reinterpret_cast<const boost::uint16_t*>(m)[hash%8] & 0x8000u);
668
+ }
669
+
670
+ inline void mark_overflow(std::size_t hash)
671
+ {
672
+ reinterpret_cast<boost::uint16_t*>(m)[hash%8]|=0x8000u;
673
+ }
674
+
675
+ static inline bool maybe_caused_overflow(unsigned char* pc)
676
+ {
677
+ std::size_t pos=reinterpret_cast<uintptr_t>(pc)%sizeof(group15);
678
+ group15 *pg=reinterpret_cast<group15*>(pc-pos);
679
+ boost::uint64_t x=((pg->m[0])>>pos)&0x000100010001ull;
680
+ boost::uint32_t y=narrow_cast<boost::uint32_t>(x|(x>>15)|(x>>30));
681
+ return !pg->is_not_overflowed(y);
682
+ };
683
+
684
+ inline int match_available()const
685
+ {
686
+ boost::uint64_t x=~(m[0]|m[1]);
687
+ boost::uint32_t y=static_cast<boost::uint32_t>(x&(x>>32));
688
+ y&=y>>16;
689
+ return y&0x7FFF;
690
+ }
691
+
692
+ inline bool is_occupied(std::size_t pos)const
693
+ {
694
+ BOOST_ASSERT(pos<N);
695
+ boost::uint64_t x=m[0]|m[1];
696
+ return (x&(0x0001000100010001ull<<pos))!=0;
697
+ }
698
+
699
+ inline int match_occupied()const
700
+ {
701
+ boost::uint64_t x=m[0]|m[1];
702
+ boost::uint32_t y=narrow_cast<boost::uint32_t>(x|(x>>32));
703
+ y|=y>>16;
704
+ return y&0x7FFF;
705
+ }
706
+
707
+ private:
708
+ using word_type=IntegralWrapper<uint64_t>;
709
+ BOOST_UNORDERED_STATIC_ASSERT(sizeof(word_type)==8);
710
+
711
+ static constexpr unsigned char available_=0,
712
+ sentinel_=1;
713
+
714
+ inline static unsigned char reduced_hash(std::size_t hash)
715
+ {
716
+ static constexpr unsigned char table[]={
717
+ 8,9,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
718
+ 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
719
+ 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
720
+ 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
721
+ 64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
722
+ 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
723
+ 96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
724
+ 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
725
+ 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
726
+ 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
727
+ 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
728
+ 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
729
+ 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
730
+ 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
731
+ 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
732
+ 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,
733
+ };
734
+
735
+ return table[narrow_cast<unsigned char>(hash)];
736
+ }
737
+
738
+ inline void set_impl(std::size_t pos,std::size_t n)
739
+ {
740
+ BOOST_ASSERT(n<256);
741
+ set_impl(m[0],pos,n&0xFu);
742
+ set_impl(m[1],pos,n>>4);
743
+ }
744
+
745
+ static inline void set_impl(word_type& x,std::size_t pos,std::size_t n)
746
+ {
747
+ static constexpr boost::uint64_t mask[]=
748
+ {
749
+ 0x0000000000000000ull,0x0000000000000001ull,0x0000000000010000ull,
750
+ 0x0000000000010001ull,0x0000000100000000ull,0x0000000100000001ull,
751
+ 0x0000000100010000ull,0x0000000100010001ull,0x0001000000000000ull,
752
+ 0x0001000000000001ull,0x0001000000010000ull,0x0001000000010001ull,
753
+ 0x0001000100000000ull,0x0001000100000001ull,0x0001000100010000ull,
754
+ 0x0001000100010001ull,
755
+ };
756
+ static constexpr boost::uint64_t imask[]=
757
+ {
758
+ 0x0001000100010001ull,0x0001000100010000ull,0x0001000100000001ull,
759
+ 0x0001000100000000ull,0x0001000000010001ull,0x0001000000010000ull,
760
+ 0x0001000000000001ull,0x0001000000000000ull,0x0000000100010001ull,
761
+ 0x0000000100010000ull,0x0000000100000001ull,0x0000000100000000ull,
762
+ 0x0000000000010001ull,0x0000000000010000ull,0x0000000000000001ull,
763
+ 0x0000000000000000ull,
764
+ };
765
+
766
+ BOOST_ASSERT(pos<16&&n<16);
767
+ x|= mask[n]<<pos;
768
+ x&=~(imask[n]<<pos);
769
+ }
770
+
771
+ inline int match_impl(std::size_t n)const
772
+ {
773
+ static constexpr boost::uint64_t mask[]=
774
+ {
775
+ 0x0000000000000000ull,0x000000000000ffffull,0x00000000ffff0000ull,
776
+ 0x00000000ffffffffull,0x0000ffff00000000ull,0x0000ffff0000ffffull,
777
+ 0x0000ffffffff0000ull,0x0000ffffffffffffull,0xffff000000000000ull,
778
+ 0xffff00000000ffffull,0xffff0000ffff0000ull,0xffff0000ffffffffull,
779
+ 0xffffffff00000000ull,0xffffffff0000ffffull,0xffffffffffff0000ull,
780
+ 0xffffffffffffffffull,
781
+ };
782
+
783
+ BOOST_ASSERT(n<256);
784
+ boost::uint64_t x=m[0]^mask[n&0xFu];
785
+ x=~((m[1]^mask[n>>4])|x);
786
+ boost::uint32_t y=static_cast<boost::uint32_t>(x&(x>>32));
787
+ y&=y>>16;
788
+ return y&0x7FFF;
789
+ }
790
+
791
+ alignas(16) word_type m[2];
792
+ };
793
+
794
+ #endif
795
+
796
+ /* foa::table_core uses a size policy to obtain the permissible sizes of the
797
+ * group array (and, by implication, the element array) and to do the
798
+ * hash->group mapping.
799
+ *
800
+ * - size_index(n) returns an unspecified "index" number used in other policy
801
+ * operations.
802
+ * - size(size_index_) returns the number of groups for the given index. It
803
+ * is guaranteed that size(size_index(n)) >= n.
804
+ * - min_size() is the minimum number of groups permissible, i.e.
805
+ * size(size_index(0)).
806
+ * - position(hash,size_index_) maps hash to a position in the range
807
+ * [0,size(size_index_)).
808
+ *
809
+ * The reason we're introducing the intermediate index value for calculating
810
+ * sizes and positions is that it allows us to optimize the implementation of
811
+ * position, which is in the hot path of lookup and insertion operations:
812
+ * pow2_size_policy, the actual size policy used by foa::table, returns 2^n
813
+ * (n>0) as permissible sizes and returns the n most significant bits
814
+ * of the hash value as the position in the group array; using a size index
815
+ * defined as i = (bits in std::size_t) - n, we have an unbeatable
816
+ * implementation of position(hash) as hash>>i.
817
+ * There's a twofold reason for choosing the high bits of hash for positioning:
818
+ * - Multiplication-based mixing tends to yield better entropy in the high
819
+ * part of its result.
820
+ * - group15 reduced-hash values take the *low* bits of hash, and we want
821
+ * these values and positioning to be as uncorrelated as possible.
822
+ */
823
+
824
+ struct pow2_size_policy
825
+ {
826
+ static inline std::size_t size_index(std::size_t n)
827
+ {
828
+ // TODO: min size is 2, see if we can bring it down to 1 without loss
829
+ // of performance
830
+
831
+ return sizeof(std::size_t)*CHAR_BIT-
832
+ (n<=2?1:((std::size_t)(boost::core::bit_width(n-1))));
833
+ }
834
+
835
+ static inline std::size_t size(std::size_t size_index_)
836
+ {
837
+ return std::size_t(1)<<(sizeof(std::size_t)*CHAR_BIT-size_index_);
838
+ }
839
+
840
+ static constexpr std::size_t min_size(){return 2;}
841
+
842
+ static inline std::size_t position(std::size_t hash,std::size_t size_index_)
843
+ {
844
+ return hash>>size_index_;
845
+ }
846
+ };
847
+
848
+ /* size index of a group array for a given *element* capacity */
849
+
850
+ template<typename Group,typename SizePolicy>
851
+ static inline std::size_t size_index_for(std::size_t n)
852
+ {
853
+ /* n/N+1 == ceil((n+1)/N) (extra +1 for the sentinel) */
854
+ return SizePolicy::size_index(n/Group::N+1);
855
+ }
856
+
857
+ /* Quadratic prober over a power-of-two range using triangular numbers.
858
+ * mask in next(mask) must be the range size minus one (and since size is 2^n,
859
+ * mask has exactly its n first bits set to 1).
860
+ */
861
+
862
+ struct pow2_quadratic_prober
863
+ {
864
+ pow2_quadratic_prober(std::size_t pos_):pos{pos_}{}
865
+
866
+ inline std::size_t get()const{return pos;}
867
+
868
+ /* next returns false when the whole array has been traversed, which ends
869
+ * probing (in practice, full-table probing will only happen with very small
870
+ * arrays).
871
+ */
872
+
873
+ inline bool next(std::size_t mask)
874
+ {
875
+ step+=1;
876
+ pos=(pos+step)&mask;
877
+ return step<=mask;
878
+ }
879
+
880
+ private:
881
+ std::size_t pos,step=0;
882
+ };
883
+
884
+ /* Mixing policies: no_mix is the identity function, and mulx_mix
885
+ * uses the mulx function from <boost/unordered/detail/mulx.hpp>.
886
+ *
887
+ * foa::table_core mixes hash results with mulx_mix unless the hash is marked
888
+ * as avalanching, i.e. of good quality
889
+ * (see <boost/unordered/hash_traits.hpp>).
890
+ */
891
+
892
+ struct no_mix
893
+ {
894
+ template<typename Hash,typename T>
895
+ static inline std::size_t mix(const Hash& h,const T& x)
896
+ {
897
+ return h(x);
898
+ }
899
+ };
900
+
901
+ struct mulx_mix
902
+ {
903
+ template<typename Hash,typename T>
904
+ static inline std::size_t mix(const Hash& h,const T& x)
905
+ {
906
+ return mulx(h(x));
907
+ }
908
+ };
909
+
910
+ /* boost::core::countr_zero has a potentially costly check for
911
+ * the case x==0.
912
+ */
913
+
914
+ inline unsigned int unchecked_countr_zero(int x)
915
+ {
916
+ #if defined(BOOST_MSVC)
917
+ unsigned long r;
918
+ _BitScanForward(&r,(unsigned long)x);
919
+ return (unsigned int)r;
920
+ #else
921
+ BOOST_UNORDERED_ASSUME(x!=0);
922
+ return (unsigned int)boost::core::countr_zero((unsigned int)x);
923
+ #endif
924
+ }
925
+
926
+ /* table_arrays controls allocation, initialization and deallocation of
927
+ * paired arrays of groups and element slots. Only one chunk of memory is
928
+ * allocated to place both arrays: this is not done for efficiency reasons,
929
+ * but in order to be able to properly align the group array without storing
930
+ * additional offset information --the alignment required (16B) is usually
931
+ * greater than alignof(std::max_align_t) and thus not guaranteed by
932
+ * allocators.
933
+ */
934
+
935
+ template<typename Group,std::size_t Size>
936
+ Group* dummy_groups()
937
+ {
938
+ /* Dummy storage initialized as if in an empty container (actually, each
939
+ * of its groups is initialized like a separate empty container).
940
+ * We make table_arrays::groups point to this when capacity()==0, so that
941
+ * we are not allocating any dynamic memory and yet lookup can be implemented
942
+ * without checking for groups==nullptr. This space won't ever be used for
943
+ * insertion as the container's capacity is precisely zero.
944
+ */
945
+
946
+ static constexpr typename Group::dummy_group_type
947
+ storage[Size]={typename Group::dummy_group_type(),};
948
+
949
+ return reinterpret_cast<Group*>(
950
+ const_cast<typename Group::dummy_group_type*>(storage));
951
+ }
952
+
953
+ template<
954
+ typename Ptr,typename Ptr2,
955
+ typename std::enable_if<!std::is_same<Ptr,Ptr2>::value>::type* = nullptr
956
+ >
957
+ Ptr to_pointer(Ptr2 p)
958
+ {
959
+ if(!p){return nullptr;}
960
+ return boost::pointer_traits<Ptr>::pointer_to(*p);
961
+ }
962
+
963
+ template<typename Ptr>
964
+ Ptr to_pointer(Ptr p)
965
+ {
966
+ return p;
967
+ }
968
+
969
+ template<typename Arrays,typename Allocator>
970
+ struct arrays_holder
971
+ {
972
+ arrays_holder(const Arrays& arrays,const Allocator& al):
973
+ arrays_{arrays},al_{al}
974
+ {}
975
+
976
+ /* not defined but VS in pre-C++17 mode needs to see it for RVO */
977
+ arrays_holder(arrays_holder const&);
978
+ arrays_holder& operator=(arrays_holder const&)=delete;
979
+
980
+ ~arrays_holder()
981
+ {
982
+ if(!released_){
983
+ arrays_.delete_(typename Arrays::allocator_type(al_),arrays_);
984
+ }
985
+ }
986
+
987
+ const Arrays& release()
988
+ {
989
+ released_=true;
990
+ return arrays_;
991
+ }
992
+
993
+ private:
994
+ Arrays arrays_;
995
+ Allocator al_;
996
+ bool released_=false;
997
+ };
998
+
999
+ template<typename Value,typename Group,typename SizePolicy,typename Allocator>
1000
+ struct table_arrays
1001
+ {
1002
+ using allocator_type=typename boost::allocator_rebind<Allocator,Value>::type;
1003
+
1004
+ using value_type=Value;
1005
+ using group_type=Group;
1006
+ static constexpr auto N=group_type::N;
1007
+ using size_policy=SizePolicy;
1008
+ using value_type_pointer=
1009
+ typename boost::allocator_pointer<allocator_type>::type;
1010
+ using group_type_pointer=
1011
+ typename boost::pointer_traits<value_type_pointer>::template
1012
+ rebind<group_type>;
1013
+ using group_type_pointer_traits=boost::pointer_traits<group_type_pointer>;
1014
+
1015
+ table_arrays(
1016
+ std::size_t gsi,std::size_t gsm,
1017
+ group_type_pointer pg,value_type_pointer pe):
1018
+ groups_size_index{gsi},groups_size_mask{gsm},groups_{pg},elements_{pe}{}
1019
+
1020
+ value_type* elements()const noexcept{return boost::to_address(elements_);}
1021
+ group_type* groups()const noexcept{return boost::to_address(groups_);}
1022
+
1023
+ static void set_arrays(table_arrays& arrays,allocator_type al,std::size_t n)
1024
+ {
1025
+ return set_arrays(
1026
+ arrays,al,n,std::is_same<group_type*,group_type_pointer>{});
1027
+ }
1028
+
1029
+ static void set_arrays(
1030
+ table_arrays& arrays,allocator_type al,std::size_t,
1031
+ std::false_type /* always allocate */)
1032
+ {
1033
+ using storage_traits=boost::allocator_traits<allocator_type>;
1034
+ auto groups_size_index=arrays.groups_size_index;
1035
+ auto groups_size=size_policy::size(groups_size_index);
1036
+
1037
+ auto sal=allocator_type(al);
1038
+ arrays.elements_=storage_traits::allocate(sal,buffer_size(groups_size));
1039
+
1040
+ /* Align arrays.groups to sizeof(group_type). table_iterator critically
1041
+ * depends on such alignment for its increment operation.
1042
+ */
1043
+
1044
+ auto p=reinterpret_cast<unsigned char*>(arrays.elements()+groups_size*N-1);
1045
+ p+=(uintptr_t(sizeof(group_type))-
1046
+ reinterpret_cast<uintptr_t>(p))%sizeof(group_type);
1047
+ arrays.groups_=
1048
+ group_type_pointer_traits::pointer_to(*reinterpret_cast<group_type*>(p));
1049
+
1050
+ initialize_groups(
1051
+ arrays.groups(),groups_size,
1052
+ is_trivially_default_constructible<group_type>{});
1053
+ arrays.groups()[groups_size-1].set_sentinel();
1054
+ }
1055
+
1056
+ static void set_arrays(
1057
+ table_arrays& arrays,allocator_type al,std::size_t n,
1058
+ std::true_type /* optimize for n==0*/)
1059
+ {
1060
+ if(!n){
1061
+ arrays.groups_=dummy_groups<group_type,size_policy::min_size()>();
1062
+ }
1063
+ else{
1064
+ set_arrays(arrays,al,n,std::false_type{});
1065
+ }
1066
+ }
1067
+
1068
+ static table_arrays new_(allocator_type al,std::size_t n)
1069
+ {
1070
+ auto groups_size_index=size_index_for<group_type,size_policy>(n);
1071
+ auto groups_size=size_policy::size(groups_size_index);
1072
+ table_arrays arrays{groups_size_index,groups_size-1,nullptr,nullptr};
1073
+
1074
+ set_arrays(arrays,al,n);
1075
+ return arrays;
1076
+ }
1077
+
1078
+ static void delete_(allocator_type al,table_arrays& arrays)noexcept
1079
+ {
1080
+ using storage_traits=boost::allocator_traits<allocator_type>;
1081
+
1082
+ auto sal=allocator_type(al);
1083
+ if(arrays.elements()){
1084
+ storage_traits::deallocate(
1085
+ sal,arrays.elements_,buffer_size(arrays.groups_size_mask+1));
1086
+ }
1087
+ }
1088
+
1089
+ /* combined space for elements and groups measured in sizeof(value_type)s */
1090
+
1091
+ static std::size_t buffer_size(std::size_t groups_size)
1092
+ {
1093
+ auto buffer_bytes=
1094
+ /* space for elements (we subtract 1 because of the sentinel) */
1095
+ sizeof(value_type)*(groups_size*N-1)+
1096
+ /* space for groups + padding for group alignment */
1097
+ sizeof(group_type)*(groups_size+1)-1;
1098
+
1099
+ /* ceil(buffer_bytes/sizeof(value_type)) */
1100
+ return (buffer_bytes+sizeof(value_type)-1)/sizeof(value_type);
1101
+ }
1102
+
1103
+ static void initialize_groups(
1104
+ group_type* pg,std::size_t size,std::true_type /* memset */)
1105
+ {
1106
+ /* memset faster/not slower than manual, assumes all zeros is group_type's
1107
+ * default layout.
1108
+ * reinterpret_cast: GCC may complain about group_type not being trivially
1109
+ * copy-assignable when we're relying on trivial copy constructibility.
1110
+ */
1111
+
1112
+ std::memset(
1113
+ reinterpret_cast<unsigned char*>(pg),0,sizeof(group_type)*size);
1114
+ }
1115
+
1116
+ static void initialize_groups(
1117
+ group_type* pg,std::size_t size,std::false_type /* manual */)
1118
+ {
1119
+ while(size--!=0)::new (pg++) group_type();
1120
+ }
1121
+
1122
+ std::size_t groups_size_index;
1123
+ std::size_t groups_size_mask;
1124
+ group_type_pointer groups_;
1125
+ value_type_pointer elements_;
1126
+ };
1127
+
1128
+ struct if_constexpr_void_else{void operator()()const{}};
1129
+
1130
+ template<bool B,typename F,typename G=if_constexpr_void_else>
1131
+ void if_constexpr(F f,G g={})
1132
+ {
1133
+ std::get<B?0:1>(std::forward_as_tuple(f,g))();
1134
+ }
1135
+
1136
+ template<bool B,typename T,typename std::enable_if<B>::type* =nullptr>
1137
+ void copy_assign_if(T& x,const T& y){x=y;}
1138
+
1139
+ template<bool B,typename T,typename std::enable_if<!B>::type* =nullptr>
1140
+ void copy_assign_if(T&,const T&){}
1141
+
1142
+ template<bool B,typename T,typename std::enable_if<B>::type* =nullptr>
1143
+ void move_assign_if(T& x,T& y){x=std::move(y);}
1144
+
1145
+ template<bool B,typename T,typename std::enable_if<!B>::type* =nullptr>
1146
+ void move_assign_if(T&,T&){}
1147
+
1148
+ template<bool B,typename T,typename std::enable_if<B>::type* =nullptr>
1149
+ void swap_if(T& x,T& y){using std::swap; swap(x,y);}
1150
+
1151
+ template<bool B,typename T,typename std::enable_if<!B>::type* =nullptr>
1152
+ void swap_if(T&,T&){}
1153
+
1154
+ template<typename Allocator>
1155
+ struct is_std_allocator:std::false_type{};
1156
+
1157
+ template<typename T>
1158
+ struct is_std_allocator<std::allocator<T>>:std::true_type{};
1159
+
1160
+ /* std::allocator::construct marked as deprecated */
1161
+ #if defined(_LIBCPP_SUPPRESS_DEPRECATED_PUSH)
1162
+ _LIBCPP_SUPPRESS_DEPRECATED_PUSH
1163
+ #elif defined(_STL_DISABLE_DEPRECATED_WARNING)
1164
+ _STL_DISABLE_DEPRECATED_WARNING
1165
+ #elif defined(_MSC_VER)
1166
+ #pragma warning(push)
1167
+ #pragma warning(disable:4996)
1168
+ #endif
1169
+
1170
+ template<typename Allocator,typename Ptr,typename... Args>
1171
+ struct alloc_has_construct
1172
+ {
1173
+ private:
1174
+ template<typename Allocator2>
1175
+ static decltype(
1176
+ std::declval<Allocator2&>().construct(
1177
+ std::declval<Ptr>(),std::declval<Args&&>()...),
1178
+ std::true_type{}
1179
+ ) check(int);
1180
+
1181
+ template<typename> static std::false_type check(...);
1182
+
1183
+ public:
1184
+ static constexpr bool value=decltype(check<Allocator>(0))::value;
1185
+ };
1186
+
1187
+ #if defined(_LIBCPP_SUPPRESS_DEPRECATED_POP)
1188
+ _LIBCPP_SUPPRESS_DEPRECATED_POP
1189
+ #elif defined(_STL_RESTORE_DEPRECATED_WARNING)
1190
+ _STL_RESTORE_DEPRECATED_WARNING
1191
+ #elif defined(_MSC_VER)
1192
+ #pragma warning(pop)
1193
+ #endif
1194
+
1195
+ /* We expose the hard-coded max load factor so that tests can use it without
1196
+ * needing to pull it from an instantiated class template such as the table
1197
+ * class.
1198
+ */
1199
+ static constexpr float mlf=0.875f;
1200
+
1201
+ template<typename Group,typename Element>
1202
+ struct table_locator
1203
+ {
1204
+ table_locator()=default;
1205
+ table_locator(Group* pg_,unsigned int n_,Element* p_):pg{pg_},n{n_},p{p_}{}
1206
+
1207
+ explicit operator bool()const noexcept{return p!=nullptr;}
1208
+
1209
+ Group *pg=nullptr;
1210
+ unsigned int n=0;
1211
+ Element *p=nullptr;
1212
+ };
1213
+
1214
+ struct try_emplace_args_t{};
1215
+
1216
+ template<typename TypePolicy,typename Allocator,typename... Args>
1217
+ class alloc_cted_insert_type
1218
+ {
1219
+ using emplace_type=typename std::conditional<
1220
+ std::is_constructible<typename TypePolicy::init_type,Args...>::value,
1221
+ typename TypePolicy::init_type,
1222
+ typename TypePolicy::value_type
1223
+ >::type;
1224
+
1225
+ using insert_type=typename std::conditional<
1226
+ std::is_constructible<typename TypePolicy::value_type,emplace_type>::value,
1227
+ emplace_type,typename TypePolicy::element_type
1228
+ >::type;
1229
+
1230
+ using alloc_cted = allocator_constructed<Allocator, insert_type, TypePolicy>;
1231
+ alloc_cted val;
1232
+
1233
+ public:
1234
+ alloc_cted_insert_type(const Allocator& al_,Args&&... args):val{al_,std::forward<Args>(args)...}
1235
+ {
1236
+ }
1237
+
1238
+ insert_type& value(){return val.value();}
1239
+ };
1240
+
1241
+ template<typename TypePolicy,typename Allocator,typename... Args>
1242
+ alloc_cted_insert_type<TypePolicy,Allocator,Args...>
1243
+ alloc_make_insert_type(const Allocator& al,Args&&... args)
1244
+ {
1245
+ return {al,std::forward<Args>(args)...};
1246
+ }
1247
+
1248
+ template <typename TypePolicy, typename Allocator, typename KFwdRef,
1249
+ typename = void>
1250
+ class alloc_cted_or_fwded_key_type
1251
+ {
1252
+ using key_type = typename TypePolicy::key_type;
1253
+ allocator_constructed<Allocator, key_type, TypePolicy> val;
1254
+
1255
+ public:
1256
+ alloc_cted_or_fwded_key_type(const Allocator& al_, KFwdRef k)
1257
+ : val(al_, std::forward<KFwdRef>(k))
1258
+ {
1259
+ }
1260
+
1261
+ key_type&& move_or_fwd() { return std::move(val.value()); }
1262
+ };
1263
+
1264
+ template <typename TypePolicy, typename Allocator, typename KFwdRef>
1265
+ class alloc_cted_or_fwded_key_type<TypePolicy, Allocator, KFwdRef,
1266
+ typename std::enable_if<
1267
+ is_similar<KFwdRef, typename TypePolicy::key_type>::value>::type>
1268
+ {
1269
+ // This specialization acts as a forwarding-reference wrapper
1270
+ BOOST_UNORDERED_STATIC_ASSERT(std::is_reference<KFwdRef>::value);
1271
+ KFwdRef ref;
1272
+
1273
+ public:
1274
+ alloc_cted_or_fwded_key_type(const Allocator&, KFwdRef k)
1275
+ : ref(std::forward<KFwdRef>(k))
1276
+ {
1277
+ }
1278
+
1279
+ KFwdRef move_or_fwd() { return std::forward<KFwdRef>(ref); }
1280
+ };
1281
+
1282
+ template <typename Container>
1283
+ using is_map =
1284
+ std::integral_constant<bool, !std::is_same<typename Container::key_type,
1285
+ typename Container::value_type>::value>;
1286
+
1287
+ template <typename Container, typename K>
1288
+ using is_emplace_kv_able = std::integral_constant<bool,
1289
+ is_map<Container>::value &&
1290
+ (is_similar<K, typename Container::key_type>::value ||
1291
+ is_complete_and_move_constructible<typename Container::key_type>::value)>;
1292
+
1293
+ /* table_core. The TypePolicy template parameter is used to generate
1294
+ * instantiations suitable for either maps or sets, and introduces non-standard
1295
+ * init_type and element_type:
1296
+ *
1297
+ * - TypePolicy::key_type and TypePolicy::value_type have the obvious
1298
+ * meaning. TypePolicy::mapped_type is expected to be provided as well
1299
+ * when key_type and value_type are not the same.
1300
+ *
1301
+ * - TypePolicy::init_type is the type implicitly converted to when
1302
+ * writing x.insert({...}). For maps, this is std::pair<Key,T> rather
1303
+ * than std::pair<const Key,T> so that, for instance, x.insert({"hello",0})
1304
+ * produces a cheaply moveable std::string&& ("hello") rather than
1305
+ * a copyable const std::string&&. foa::table::insert is extended to accept
1306
+ * both init_type and value_type references.
1307
+ *
1308
+ * - TypePolicy::construct and TypePolicy::destroy are used for the
1309
+ * construction and destruction of the internal types: value_type,
1310
+ * init_type, element_type, and key_type.
1311
+ *
1312
+ * - TypePolicy::move is used to provide move semantics for the internal
1313
+ * types used by the container during rehashing and emplace. These types
1314
+ * are init_type, value_type and emplace_type. During insertion, a
1315
+ * stack-local type will be created based on the constructibility of the
1316
+ * value_type and the supplied arguments. TypePolicy::move is used here
1317
+ * for transfer of ownership. Similarly, TypePolicy::move is also used
1318
+ * during rehashing when elements are moved to the new table.
1319
+ *
1320
+ * - TypePolicy::extract returns a const reference to the key part of
1321
+ * a value of type value_type, init_type, element_type or
1322
+ * decltype(TypePolicy::move(...)).
1323
+ *
1324
+ * - TypePolicy::element_type is the type that table_arrays uses when
1325
+ * allocating buckets, which allows us to have flat and node container.
1326
+ * For flat containers, element_type is value_type. For node
1327
+ * containers, it is a strong typedef to value_type*.
1328
+ *
1329
+ * - TypePolicy::value_from returns a mutable reference to value_type from
1330
+ * a given element_type. This is used when elements of the table themselves
1331
+ * need to be moved, such as during move construction/assignment when
1332
+ * allocators are unequal and there is no propagation. For all other cases,
1333
+ * the element_type itself is moved.
1334
+ */
1335
+
1336
+ #include <boost/unordered/detail/foa/ignore_wshadow.hpp>
1337
+
1338
+ #if defined(BOOST_MSVC)
1339
+ #pragma warning(push)
1340
+ #pragma warning(disable:4714) /* marked as __forceinline not inlined */
1341
+ #endif
1342
+
1343
+ #if BOOST_WORKAROUND(BOOST_MSVC,<=1900)
1344
+ /* VS2015 marks as unreachable generic catch clauses around non-throwing
1345
+ * code.
1346
+ */
1347
+ #pragma warning(push)
1348
+ #pragma warning(disable:4702)
1349
+ #endif
1350
+
1351
+ template<
1352
+ typename TypePolicy,typename Group,template<typename...> class Arrays,
1353
+ typename SizeControl,typename Hash,typename Pred,typename Allocator
1354
+ >
1355
+ class
1356
+
1357
+ #if defined(_MSC_VER)&&_MSC_FULL_VER>=190023918
1358
+ __declspec(empty_bases) /* activate EBO with multiple inheritance */
1359
+ #endif
1360
+
1361
+ table_core:empty_value<Hash,0>,empty_value<Pred,1>,empty_value<Allocator,2>
1362
+ {
1363
+ public:
1364
+ using type_policy=TypePolicy;
1365
+ using group_type=Group;
1366
+ static constexpr auto N=group_type::N;
1367
+ using size_policy=pow2_size_policy;
1368
+ using prober=pow2_quadratic_prober;
1369
+ using mix_policy=typename std::conditional<
1370
+ hash_is_avalanching<Hash>::value,
1371
+ no_mix,
1372
+ mulx_mix
1373
+ >::type;
1374
+ using alloc_traits=boost::allocator_traits<Allocator>;
1375
+ using element_type=typename type_policy::element_type;
1376
+ using arrays_type=Arrays<element_type,group_type,size_policy,Allocator>;
1377
+ using size_ctrl_type=SizeControl;
1378
+ static constexpr auto uses_fancy_pointers=!std::is_same<
1379
+ typename alloc_traits::pointer,
1380
+ typename alloc_traits::value_type*
1381
+ >::value;
1382
+
1383
+ using key_type=typename type_policy::key_type;
1384
+ using init_type=typename type_policy::init_type;
1385
+ using value_type=typename type_policy::value_type;
1386
+ using hasher=Hash;
1387
+ using key_equal=Pred;
1388
+ using allocator_type=Allocator;
1389
+ using pointer=value_type*;
1390
+ using const_pointer=const value_type*;
1391
+ using reference=value_type&;
1392
+ using const_reference=const value_type&;
1393
+ using size_type=std::size_t;
1394
+ using difference_type=std::ptrdiff_t;
1395
+ using locator=table_locator<group_type,element_type>;
1396
+ using arrays_holder_type=arrays_holder<arrays_type,Allocator>;
1397
+
1398
+ table_core(
1399
+ std::size_t n=default_bucket_count,const Hash& h_=Hash(),
1400
+ const Pred& pred_=Pred(),const Allocator& al_=Allocator()):
1401
+ hash_base{empty_init,h_},pred_base{empty_init,pred_},
1402
+ allocator_base{empty_init,al_},arrays(new_arrays(n)),
1403
+ size_ctrl{initial_max_load(),0}
1404
+ {}
1405
+
1406
+ /* genericize on an ArraysFn so that we can do things like delay an
1407
+ * allocation for the group_access data required by cfoa after the move
1408
+ * constructors of Hash, Pred have been invoked
1409
+ */
1410
+ template<typename ArraysFn>
1411
+ table_core(
1412
+ Hash&& h_,Pred&& pred_,Allocator&& al_,
1413
+ ArraysFn arrays_fn,const size_ctrl_type& size_ctrl_):
1414
+ hash_base{empty_init,std::move(h_)},
1415
+ pred_base{empty_init,std::move(pred_)},
1416
+ allocator_base{empty_init,std::move(al_)},
1417
+ arrays(arrays_fn()),size_ctrl(size_ctrl_)
1418
+ {}
1419
+
1420
+ table_core(const table_core& x):
1421
+ table_core{x,alloc_traits::select_on_container_copy_construction(x.al())}{}
1422
+
1423
+ template<typename ArraysFn>
1424
+ table_core(table_core&& x,arrays_holder_type&& ah,ArraysFn arrays_fn):
1425
+ table_core(
1426
+ std::move(x.h()),std::move(x.pred()),std::move(x.al()),
1427
+ arrays_fn,x.size_ctrl)
1428
+ {
1429
+ x.arrays=ah.release();
1430
+ x.size_ctrl.ml=x.initial_max_load();
1431
+ x.size_ctrl.size=0;
1432
+ }
1433
+
1434
+ table_core(table_core&& x)
1435
+ noexcept(
1436
+ std::is_nothrow_move_constructible<Hash>::value&&
1437
+ std::is_nothrow_move_constructible<Pred>::value&&
1438
+ std::is_nothrow_move_constructible<Allocator>::value&&
1439
+ !uses_fancy_pointers):
1440
+ table_core{
1441
+ std::move(x),x.make_empty_arrays(),[&x]{return x.arrays;}}
1442
+ {}
1443
+
1444
+ table_core(const table_core& x,const Allocator& al_):
1445
+ table_core{std::size_t(std::ceil(float(x.size())/mlf)),x.h(),x.pred(),al_}
1446
+ {
1447
+ copy_elements_from(x);
1448
+ }
1449
+
1450
+ table_core(table_core&& x,const Allocator& al_):
1451
+ table_core{std::move(x.h()),std::move(x.pred()),al_}
1452
+ {
1453
+ if(al()==x.al()){
1454
+ using std::swap;
1455
+ swap(arrays,x.arrays);
1456
+ swap(size_ctrl,x.size_ctrl);
1457
+ }
1458
+ else{
1459
+ reserve(x.size());
1460
+ clear_on_exit c{x};
1461
+ (void)c; /* unused var warning */
1462
+
1463
+ /* This works because subsequent x.clear() does not depend on the
1464
+ * elements' values.
1465
+ */
1466
+ x.for_all_elements([this](element_type* p){
1467
+ unchecked_insert(type_policy::move(type_policy::value_from(*p)));
1468
+ });
1469
+ }
1470
+ }
1471
+
1472
+ ~table_core()noexcept
1473
+ {
1474
+ for_all_elements([this](element_type* p){
1475
+ destroy_element(p);
1476
+ });
1477
+ delete_arrays(arrays);
1478
+ }
1479
+
1480
+ std::size_t initial_max_load()const
1481
+ {
1482
+ static constexpr std::size_t small_capacity=2*N-1;
1483
+
1484
+ auto capacity_=capacity();
1485
+ if(capacity_<=small_capacity){
1486
+ return capacity_; /* we allow 100% usage */
1487
+ }
1488
+ else{
1489
+ return (std::size_t)(mlf*(float)(capacity_));
1490
+ }
1491
+ }
1492
+
1493
+ arrays_holder_type make_empty_arrays()const
1494
+ {
1495
+ return make_arrays(0);
1496
+ }
1497
+
1498
+ table_core& operator=(const table_core& x)
1499
+ {
1500
+ BOOST_UNORDERED_STATIC_ASSERT_HASH_PRED(Hash, Pred)
1501
+
1502
+ static constexpr auto pocca=
1503
+ alloc_traits::propagate_on_container_copy_assignment::value;
1504
+
1505
+ if(this!=std::addressof(x)){
1506
+ /* If copy construction here winds up throwing, the container is still
1507
+ * left intact so we perform these operations first.
1508
+ */
1509
+ hasher tmp_h=x.h();
1510
+ key_equal tmp_p=x.pred();
1511
+
1512
+ clear();
1513
+
1514
+ /* Because we've asserted at compile-time that Hash and Pred are nothrow
1515
+ * swappable, we can safely mutate our source container and maintain
1516
+ * consistency between the Hash, Pred compatibility.
1517
+ */
1518
+ using std::swap;
1519
+ swap(h(),tmp_h);
1520
+ swap(pred(),tmp_p);
1521
+
1522
+ if_constexpr<pocca>([&,this]{
1523
+ if(al()!=x.al()){
1524
+ auto ah=x.make_arrays(std::size_t(std::ceil(float(x.size())/mlf)));
1525
+ delete_arrays(arrays);
1526
+ arrays=ah.release();
1527
+ size_ctrl.ml=initial_max_load();
1528
+ }
1529
+ copy_assign_if<pocca>(al(),x.al());
1530
+ });
1531
+ /* noshrink: favor memory reuse over tightness */
1532
+ noshrink_reserve(x.size());
1533
+ copy_elements_from(x);
1534
+ }
1535
+ return *this;
1536
+ }
1537
+
1538
+ #if defined(BOOST_MSVC)
1539
+ #pragma warning(push)
1540
+ #pragma warning(disable:4127) /* conditional expression is constant */
1541
+ #endif
1542
+
1543
+ table_core& operator=(table_core&& x)
1544
+ noexcept(
1545
+ (alloc_traits::propagate_on_container_move_assignment::value||
1546
+ alloc_traits::is_always_equal::value)&&!uses_fancy_pointers)
1547
+ {
1548
+ BOOST_UNORDERED_STATIC_ASSERT_HASH_PRED(Hash, Pred)
1549
+
1550
+ static constexpr auto pocma=
1551
+ alloc_traits::propagate_on_container_move_assignment::value;
1552
+
1553
+ if(this!=std::addressof(x)){
1554
+ /* Given ambiguity in implementation strategies briefly discussed here:
1555
+ * https://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#2227
1556
+ *
1557
+ * we opt into requiring nothrow swappability and eschew the move
1558
+ * operations associated with Hash, Pred.
1559
+ *
1560
+ * To this end, we ensure that the user never has to consider the
1561
+ * moved-from state of their Hash, Pred objects
1562
+ */
1563
+
1564
+ using std::swap;
1565
+
1566
+ clear();
1567
+
1568
+ if(pocma||al()==x.al()){
1569
+ auto ah=x.make_empty_arrays();
1570
+ swap(h(),x.h());
1571
+ swap(pred(),x.pred());
1572
+ delete_arrays(arrays);
1573
+ move_assign_if<pocma>(al(),x.al());
1574
+ arrays=x.arrays;
1575
+ size_ctrl.ml=std::size_t(x.size_ctrl.ml);
1576
+ size_ctrl.size=std::size_t(x.size_ctrl.size);
1577
+ x.arrays=ah.release();
1578
+ x.size_ctrl.ml=x.initial_max_load();
1579
+ x.size_ctrl.size=0;
1580
+ }
1581
+ else{
1582
+ swap(h(),x.h());
1583
+ swap(pred(),x.pred());
1584
+
1585
+ /* noshrink: favor memory reuse over tightness */
1586
+ noshrink_reserve(x.size());
1587
+ clear_on_exit c{x};
1588
+ (void)c; /* unused var warning */
1589
+
1590
+ /* This works because subsequent x.clear() does not depend on the
1591
+ * elements' values.
1592
+ */
1593
+ x.for_all_elements([this](element_type* p){
1594
+ unchecked_insert(type_policy::move(type_policy::value_from(*p)));
1595
+ });
1596
+ }
1597
+ }
1598
+ return *this;
1599
+ }
1600
+
1601
+ #if defined(BOOST_MSVC)
1602
+ #pragma warning(pop) /* C4127 */
1603
+ #endif
1604
+
1605
+ allocator_type get_allocator()const noexcept{return al();}
1606
+
1607
+ bool empty()const noexcept{return size()==0;}
1608
+ std::size_t size()const noexcept{return size_ctrl.size;}
1609
+ std::size_t max_size()const noexcept{return SIZE_MAX;}
1610
+
1611
+ BOOST_FORCEINLINE
1612
+ void erase(group_type* pg,unsigned int pos,element_type* p)noexcept
1613
+ {
1614
+ destroy_element(p);
1615
+ recover_slot(pg,pos);
1616
+ }
1617
+
1618
+ BOOST_FORCEINLINE
1619
+ void erase(unsigned char* pc,element_type* p)noexcept
1620
+ {
1621
+ destroy_element(p);
1622
+ recover_slot(pc);
1623
+ }
1624
+
1625
+ template<typename Key>
1626
+ BOOST_FORCEINLINE locator find(const Key& x)const
1627
+ {
1628
+ auto hash=hash_for(x);
1629
+ return find(x,position_for(hash),hash);
1630
+ }
1631
+
1632
+ #if defined(BOOST_MSVC)
1633
+ /* warning: forcing value to bool 'true' or 'false' in bool(pred()...) */
1634
+ #pragma warning(push)
1635
+ #pragma warning(disable:4800)
1636
+ #endif
1637
+
1638
+ template<typename Key>
1639
+ BOOST_FORCEINLINE locator find(
1640
+ const Key& x,std::size_t pos0,std::size_t hash)const
1641
+ {
1642
+ prober pb(pos0);
1643
+ do{
1644
+ auto pos=pb.get();
1645
+ auto pg=arrays.groups()+pos;
1646
+ auto mask=pg->match(hash);
1647
+ if(mask){
1648
+ auto elements=arrays.elements();
1649
+ BOOST_UNORDERED_ASSUME(elements!=nullptr);
1650
+ auto p=elements+pos*N;
1651
+ BOOST_UNORDERED_PREFETCH_ELEMENTS(p,N);
1652
+ do{
1653
+ auto n=unchecked_countr_zero(mask);
1654
+ if(BOOST_LIKELY(bool(pred()(x,key_from(p[n]))))){
1655
+ return {pg,n,p+n};
1656
+ }
1657
+ mask&=mask-1;
1658
+ }while(mask);
1659
+ }
1660
+ if(BOOST_LIKELY(pg->is_not_overflowed(hash))){
1661
+ return {};
1662
+ }
1663
+ }
1664
+ while(BOOST_LIKELY(pb.next(arrays.groups_size_mask)));
1665
+ return {};
1666
+ }
1667
+
1668
+ #if defined(BOOST_MSVC)
1669
+ #pragma warning(pop) /* C4800 */
1670
+ #endif
1671
+
1672
+ void swap(table_core& x)
1673
+ noexcept(
1674
+ alloc_traits::propagate_on_container_swap::value||
1675
+ alloc_traits::is_always_equal::value)
1676
+ {
1677
+ BOOST_UNORDERED_STATIC_ASSERT_HASH_PRED(Hash, Pred)
1678
+
1679
+ static constexpr auto pocs=
1680
+ alloc_traits::propagate_on_container_swap::value;
1681
+
1682
+ using std::swap;
1683
+ if_constexpr<pocs>([&,this]{
1684
+ swap_if<pocs>(al(),x.al());
1685
+ },
1686
+ [&,this]{ /* else */
1687
+ BOOST_ASSERT(al()==x.al());
1688
+ (void)this; /* makes sure captured this is used */
1689
+ });
1690
+
1691
+ swap(h(),x.h());
1692
+ swap(pred(),x.pred());
1693
+ swap(arrays,x.arrays);
1694
+ swap(size_ctrl,x.size_ctrl);
1695
+ }
1696
+
1697
+ void clear()noexcept
1698
+ {
1699
+ auto p=arrays.elements();
1700
+ if(p){
1701
+ for(auto pg=arrays.groups(),last=pg+arrays.groups_size_mask+1;
1702
+ pg!=last;++pg,p+=N){
1703
+ auto mask=match_really_occupied(pg,last);
1704
+ while(mask){
1705
+ destroy_element(p+unchecked_countr_zero(mask));
1706
+ mask&=mask-1;
1707
+ }
1708
+ /* we wipe the entire metadata to reset the overflow byte as well */
1709
+ pg->initialize();
1710
+ }
1711
+ arrays.groups()[arrays.groups_size_mask].set_sentinel();
1712
+ size_ctrl.ml=initial_max_load();
1713
+ size_ctrl.size=0;
1714
+ }
1715
+ }
1716
+
1717
+ hasher hash_function()const{return h();}
1718
+ key_equal key_eq()const{return pred();}
1719
+
1720
+ std::size_t capacity()const noexcept
1721
+ {
1722
+ return arrays.elements()?(arrays.groups_size_mask+1)*N-1:0;
1723
+ }
1724
+
1725
+ float load_factor()const noexcept
1726
+ {
1727
+ if(capacity()==0)return 0;
1728
+ else return float(size())/float(capacity());
1729
+ }
1730
+
1731
+ float max_load_factor()const noexcept{return mlf;}
1732
+
1733
+ std::size_t max_load()const noexcept{return size_ctrl.ml;}
1734
+
1735
+ void rehash(std::size_t n)
1736
+ {
1737
+ auto m=size_t(std::ceil(float(size())/mlf));
1738
+ if(m>n)n=m;
1739
+ if(n)n=capacity_for(n); /* exact resulting capacity */
1740
+
1741
+ if(n!=capacity())unchecked_rehash(n);
1742
+ }
1743
+
1744
+ void reserve(std::size_t n)
1745
+ {
1746
+ rehash(std::size_t(std::ceil(float(n)/mlf)));
1747
+ }
1748
+
1749
+ friend bool operator==(const table_core& x,const table_core& y)
1750
+ {
1751
+ return
1752
+ x.size()==y.size()&&
1753
+ x.for_all_elements_while([&](element_type* p){
1754
+ auto loc=y.find(key_from(*p));
1755
+ return loc&&
1756
+ const_cast<const value_type&>(type_policy::value_from(*p))==
1757
+ const_cast<const value_type&>(type_policy::value_from(*loc.p));
1758
+ });
1759
+ }
1760
+
1761
+ friend bool operator!=(const table_core& x,const table_core& y)
1762
+ {
1763
+ return !(x==y);
1764
+ }
1765
+
1766
+ struct clear_on_exit
1767
+ {
1768
+ ~clear_on_exit(){x.clear();}
1769
+ table_core& x;
1770
+ };
1771
+
1772
+ Hash& h(){return hash_base::get();}
1773
+ const Hash& h()const{return hash_base::get();}
1774
+ Pred& pred(){return pred_base::get();}
1775
+ const Pred& pred()const{return pred_base::get();}
1776
+ Allocator& al(){return allocator_base::get();}
1777
+ const Allocator& al()const{return allocator_base::get();}
1778
+
1779
+ template<typename... Args>
1780
+ void construct_element(element_type* p,Args&&... args)
1781
+ {
1782
+ type_policy::construct(al(),p,std::forward<Args>(args)...);
1783
+ }
1784
+
1785
+ template<typename... Args>
1786
+ void construct_element(element_type* p,try_emplace_args_t,Args&&... args)
1787
+ {
1788
+ construct_element_from_try_emplace_args(
1789
+ p,
1790
+ std::integral_constant<bool,std::is_same<key_type,value_type>::value>{},
1791
+ std::forward<Args>(args)...);
1792
+ }
1793
+
1794
+ void destroy_element(element_type* p)noexcept
1795
+ {
1796
+ type_policy::destroy(al(),p);
1797
+ }
1798
+
1799
+ struct destroy_element_on_exit
1800
+ {
1801
+ ~destroy_element_on_exit(){this_->destroy_element(p);}
1802
+ table_core *this_;
1803
+ element_type *p;
1804
+ };
1805
+
1806
+ template<typename T>
1807
+ static inline auto key_from(const T& x)
1808
+ ->decltype(type_policy::extract(x))
1809
+ {
1810
+ return type_policy::extract(x);
1811
+ }
1812
+
1813
+ template<typename Key,typename... Args>
1814
+ static inline const Key& key_from(
1815
+ try_emplace_args_t,const Key& x,const Args&...)
1816
+ {
1817
+ return x;
1818
+ }
1819
+
1820
+ template<typename Key>
1821
+ inline std::size_t hash_for(const Key& x)const
1822
+ {
1823
+ return mix_policy::mix(h(),x);
1824
+ }
1825
+
1826
+ inline std::size_t position_for(std::size_t hash)const
1827
+ {
1828
+ return position_for(hash,arrays);
1829
+ }
1830
+
1831
+ static inline std::size_t position_for(
1832
+ std::size_t hash,const arrays_type& arrays_)
1833
+ {
1834
+ return size_policy::position(hash,arrays_.groups_size_index);
1835
+ }
1836
+
1837
+ static inline int match_really_occupied(group_type* pg,group_type* last)
1838
+ {
1839
+ /* excluding the sentinel */
1840
+ return pg->match_occupied()&~(int(pg==last-1)<<(N-1));
1841
+ }
1842
+
1843
+ template<typename... Args>
1844
+ locator unchecked_emplace_at(
1845
+ std::size_t pos0,std::size_t hash,Args&&... args)
1846
+ {
1847
+ auto res=nosize_unchecked_emplace_at(
1848
+ arrays,pos0,hash,std::forward<Args>(args)...);
1849
+ ++size_ctrl.size;
1850
+ return res;
1851
+ }
1852
+
1853
+ BOOST_NOINLINE void unchecked_rehash_for_growth()
1854
+ {
1855
+ auto new_arrays_=new_arrays_for_growth();
1856
+ unchecked_rehash(new_arrays_);
1857
+ }
1858
+
1859
+ template<typename... Args>
1860
+ BOOST_NOINLINE locator
1861
+ unchecked_emplace_with_rehash(std::size_t hash,Args&&... args)
1862
+ {
1863
+ auto new_arrays_=new_arrays_for_growth();
1864
+ locator it;
1865
+ BOOST_TRY{
1866
+ /* strong exception guarantee -> try insertion before rehash */
1867
+ it=nosize_unchecked_emplace_at(
1868
+ new_arrays_,position_for(hash,new_arrays_),
1869
+ hash,std::forward<Args>(args)...);
1870
+ }
1871
+ BOOST_CATCH(...){
1872
+ delete_arrays(new_arrays_);
1873
+ BOOST_RETHROW
1874
+ }
1875
+ BOOST_CATCH_END
1876
+
1877
+ /* new_arrays_ lifetime taken care of by unchecked_rehash */
1878
+ unchecked_rehash(new_arrays_);
1879
+ ++size_ctrl.size;
1880
+ return it;
1881
+ }
1882
+
1883
+ void noshrink_reserve(std::size_t n)
1884
+ {
1885
+ /* used only on assignment after element clearance */
1886
+ BOOST_ASSERT(empty());
1887
+
1888
+ if(n){
1889
+ n=std::size_t(std::ceil(float(n)/mlf)); /* elements -> slots */
1890
+ n=capacity_for(n); /* exact resulting capacity */
1891
+
1892
+ if(n>capacity()){
1893
+ auto new_arrays_=new_arrays(n);
1894
+ delete_arrays(arrays);
1895
+ arrays=new_arrays_;
1896
+ size_ctrl.ml=initial_max_load();
1897
+ }
1898
+ }
1899
+ }
1900
+
1901
+ template<typename F>
1902
+ void for_all_elements(F f)const
1903
+ {
1904
+ for_all_elements(arrays,f);
1905
+ }
1906
+
1907
+ template<typename F>
1908
+ static auto for_all_elements(const arrays_type& arrays_,F f)
1909
+ ->decltype(f(nullptr),void())
1910
+ {
1911
+ for_all_elements_while(arrays_,[&](element_type* p){f(p);return true;});
1912
+ }
1913
+
1914
+ template<typename F>
1915
+ static auto for_all_elements(const arrays_type& arrays_,F f)
1916
+ ->decltype(f(nullptr,0,nullptr),void())
1917
+ {
1918
+ for_all_elements_while(
1919
+ arrays_,[&](group_type* pg,unsigned int n,element_type* p)
1920
+ {f(pg,n,p);return true;});
1921
+ }
1922
+
1923
+ template<typename F>
1924
+ bool for_all_elements_while(F f)const
1925
+ {
1926
+ return for_all_elements_while(arrays,f);
1927
+ }
1928
+
1929
+ template<typename F>
1930
+ static auto for_all_elements_while(const arrays_type& arrays_,F f)
1931
+ ->decltype(f(nullptr),bool())
1932
+ {
1933
+ return for_all_elements_while(
1934
+ arrays_,[&](group_type*,unsigned int,element_type* p){return f(p);});
1935
+ }
1936
+
1937
+ template<typename F>
1938
+ static auto for_all_elements_while(const arrays_type& arrays_,F f)
1939
+ ->decltype(f(nullptr,0,nullptr),bool())
1940
+ {
1941
+ auto p=arrays_.elements();
1942
+ if(p){
1943
+ for(auto pg=arrays_.groups(),last=pg+arrays_.groups_size_mask+1;
1944
+ pg!=last;++pg,p+=N){
1945
+ auto mask=match_really_occupied(pg,last);
1946
+ while(mask){
1947
+ auto n=unchecked_countr_zero(mask);
1948
+ if(!f(pg,n,p+n))return false;
1949
+ mask&=mask-1;
1950
+ }
1951
+ }
1952
+ }
1953
+ return true;
1954
+ }
1955
+
1956
+ arrays_type arrays;
1957
+ size_ctrl_type size_ctrl;
1958
+
1959
+ private:
1960
+ template<
1961
+ typename,typename,template<typename...> class,
1962
+ typename,typename,typename,typename
1963
+ >
1964
+ friend class table_core;
1965
+
1966
+ using hash_base=empty_value<Hash,0>;
1967
+ using pred_base=empty_value<Pred,1>;
1968
+ using allocator_base=empty_value<Allocator,2>;
1969
+
1970
+ /* used by allocator-extended move ctor */
1971
+
1972
+ table_core(Hash&& h_,Pred&& pred_,const Allocator& al_):
1973
+ hash_base{empty_init,std::move(h_)},
1974
+ pred_base{empty_init,std::move(pred_)},
1975
+ allocator_base{empty_init,al_},arrays(new_arrays(0)),
1976
+ size_ctrl{initial_max_load(),0}
1977
+ {
1978
+ }
1979
+
1980
+ arrays_type new_arrays(std::size_t n)const
1981
+ {
1982
+ return arrays_type::new_(typename arrays_type::allocator_type(al()),n);
1983
+ }
1984
+
1985
+ arrays_type new_arrays_for_growth()const
1986
+ {
1987
+ /* Due to the anti-drift mechanism (see recover_slot), the new arrays may
1988
+ * be of the same size as the old arrays; in the limit, erasing one
1989
+ * element at full load and then inserting could bring us back to the same
1990
+ * capacity after a costly rehash. To avoid this, we jump to the next
1991
+ * capacity level when the number of erased elements is <= 10% of total
1992
+ * elements at full load, which is implemented by requesting additional
1993
+ * F*size elements, with F = P * 10% / (1 - P * 10%), where P is the
1994
+ * probability of an element having caused overflow; P has been measured as
1995
+ * ~0.162 under ideal conditions, yielding F ~ 0.0165 ~ 1/61.
1996
+ */
1997
+ return new_arrays(std::size_t(
1998
+ std::ceil(static_cast<float>(size()+size()/61+1)/mlf)));
1999
+ }
2000
+
2001
+ void delete_arrays(arrays_type& arrays_)noexcept
2002
+ {
2003
+ arrays_type::delete_(typename arrays_type::allocator_type(al()),arrays_);
2004
+ }
2005
+
2006
+ arrays_holder_type make_arrays(std::size_t n)const
2007
+ {
2008
+ return {new_arrays(n),al()};
2009
+ }
2010
+
2011
+ template<typename Key,typename... Args>
2012
+ void construct_element_from_try_emplace_args(
2013
+ element_type* p,std::false_type,Key&& x,Args&&... args)
2014
+ {
2015
+ type_policy::construct(
2016
+ this->al(),p,
2017
+ std::piecewise_construct,
2018
+ std::forward_as_tuple(std::forward<Key>(x)),
2019
+ std::forward_as_tuple(std::forward<Args>(args)...));
2020
+ }
2021
+
2022
+ /* This overload allows boost::unordered_flat_set to internally use
2023
+ * try_emplace to implement heterogeneous insert (P2363).
2024
+ */
2025
+
2026
+ template<typename Key>
2027
+ void construct_element_from_try_emplace_args(
2028
+ element_type* p,std::true_type,Key&& x)
2029
+ {
2030
+ type_policy::construct(this->al(),p,std::forward<Key>(x));
2031
+ }
2032
+
2033
+ void copy_elements_from(const table_core& x)
2034
+ {
2035
+ BOOST_ASSERT(empty());
2036
+ BOOST_ASSERT(this!=std::addressof(x));
2037
+ if(arrays.groups_size_mask==x.arrays.groups_size_mask){
2038
+ fast_copy_elements_from(x);
2039
+ }
2040
+ else{
2041
+ x.for_all_elements([this](const element_type* p){
2042
+ unchecked_insert(*p);
2043
+ });
2044
+ }
2045
+ }
2046
+
2047
+ void fast_copy_elements_from(const table_core& x)
2048
+ {
2049
+ if(arrays.elements()&&x.arrays.elements()){
2050
+ copy_elements_array_from(x);
2051
+ copy_groups_array_from(x);
2052
+ size_ctrl.ml=std::size_t(x.size_ctrl.ml);
2053
+ size_ctrl.size=std::size_t(x.size_ctrl.size);
2054
+ }
2055
+ }
2056
+
2057
+ void copy_elements_array_from(const table_core& x)
2058
+ {
2059
+ copy_elements_array_from(
2060
+ x,
2061
+ std::integral_constant<
2062
+ bool,
2063
+ is_trivially_copy_constructible<element_type>::value&&(
2064
+ is_std_allocator<Allocator>::value||
2065
+ !alloc_has_construct<Allocator,value_type*,const value_type&>::value)
2066
+ >{}
2067
+ );
2068
+ }
2069
+
2070
+ void copy_elements_array_from(
2071
+ const table_core& x,std::true_type /* -> memcpy */)
2072
+ {
2073
+ /* reinterpret_cast: GCC may complain about value_type not being trivially
2074
+ * copy-assignable when we're relying on trivial copy constructibility.
2075
+ */
2076
+ std::memcpy(
2077
+ reinterpret_cast<unsigned char*>(arrays.elements()),
2078
+ reinterpret_cast<unsigned char*>(x.arrays.elements()),
2079
+ x.capacity()*sizeof(value_type));
2080
+ }
2081
+
2082
+ void copy_elements_array_from(
2083
+ const table_core& x,std::false_type /* -> manual */)
2084
+ {
2085
+ std::size_t num_constructed=0;
2086
+ BOOST_TRY{
2087
+ x.for_all_elements([&,this](const element_type* p){
2088
+ construct_element(arrays.elements()+(p-x.arrays.elements()),*p);
2089
+ ++num_constructed;
2090
+ });
2091
+ }
2092
+ BOOST_CATCH(...){
2093
+ if(num_constructed){
2094
+ x.for_all_elements_while([&,this](const element_type* p){
2095
+ destroy_element(arrays.elements()+(p-x.arrays.elements()));
2096
+ return --num_constructed!=0;
2097
+ });
2098
+ }
2099
+ BOOST_RETHROW
2100
+ }
2101
+ BOOST_CATCH_END
2102
+ }
2103
+
2104
+ void copy_groups_array_from(const table_core& x) {
2105
+ copy_groups_array_from(x,is_trivially_copy_assignable<group_type>{});
2106
+ }
2107
+
2108
+ void copy_groups_array_from(
2109
+ const table_core& x, std::true_type /* -> memcpy */)
2110
+ {
2111
+ std::memcpy(
2112
+ arrays.groups(),x.arrays.groups(),
2113
+ (arrays.groups_size_mask+1)*sizeof(group_type));
2114
+ }
2115
+
2116
+ void copy_groups_array_from(
2117
+ const table_core& x, std::false_type /* -> manual */)
2118
+ {
2119
+ auto pg=arrays.groups();
2120
+ auto xpg=x.arrays.groups();
2121
+ for(std::size_t i=0;i<arrays.groups_size_mask+1;++i){
2122
+ pg[i]=xpg[i];
2123
+ }
2124
+ }
2125
+
2126
+ void recover_slot(unsigned char* pc)
2127
+ {
2128
+ /* If this slot potentially caused overflow, we decrease the maximum load
2129
+ * so that average probe length won't increase unboundedly in repeated
2130
+ * insert/erase cycles (drift).
2131
+ */
2132
+ size_ctrl.ml-=group_type::maybe_caused_overflow(pc);
2133
+ group_type::reset(pc);
2134
+ --size_ctrl.size;
2135
+ }
2136
+
2137
+ void recover_slot(group_type* pg,std::size_t pos)
2138
+ {
2139
+ recover_slot(reinterpret_cast<unsigned char*>(pg)+pos);
2140
+ }
2141
+
2142
+ static std::size_t capacity_for(std::size_t n)
2143
+ {
2144
+ return size_policy::size(size_index_for<group_type,size_policy>(n))*N-1;
2145
+ }
2146
+
2147
+ BOOST_NOINLINE void unchecked_rehash(std::size_t n)
2148
+ {
2149
+ auto new_arrays_=new_arrays(n);
2150
+ unchecked_rehash(new_arrays_);
2151
+ }
2152
+
2153
+ BOOST_NOINLINE void unchecked_rehash(arrays_type& new_arrays_)
2154
+ {
2155
+ std::size_t num_destroyed=0;
2156
+ BOOST_TRY{
2157
+ for_all_elements([&,this](element_type* p){
2158
+ nosize_transfer_element(p,new_arrays_,num_destroyed);
2159
+ });
2160
+ }
2161
+ BOOST_CATCH(...){
2162
+ if(num_destroyed){
2163
+ for_all_elements_while(
2164
+ [&,this](group_type* pg,unsigned int n,element_type*){
2165
+ recover_slot(pg,n);
2166
+ return --num_destroyed!=0;
2167
+ }
2168
+ );
2169
+ }
2170
+ for_all_elements(new_arrays_,[this](element_type* p){
2171
+ destroy_element(p);
2172
+ });
2173
+ delete_arrays(new_arrays_);
2174
+ BOOST_RETHROW
2175
+ }
2176
+ BOOST_CATCH_END
2177
+
2178
+ /* either all moved and destroyed or all copied */
2179
+ BOOST_ASSERT(num_destroyed==size()||num_destroyed==0);
2180
+ if(num_destroyed!=size()){
2181
+ for_all_elements([this](element_type* p){
2182
+ destroy_element(p);
2183
+ });
2184
+ }
2185
+ delete_arrays(arrays);
2186
+ arrays=new_arrays_;
2187
+ size_ctrl.ml=initial_max_load();
2188
+ }
2189
+
2190
+ template<typename Value>
2191
+ void unchecked_insert(Value&& x)
2192
+ {
2193
+ auto hash=hash_for(key_from(x));
2194
+ unchecked_emplace_at(position_for(hash),hash,std::forward<Value>(x));
2195
+ }
2196
+
2197
+ void nosize_transfer_element(
2198
+ element_type* p,const arrays_type& arrays_,std::size_t& num_destroyed)
2199
+ {
2200
+ nosize_transfer_element(
2201
+ p,hash_for(key_from(*p)),arrays_,num_destroyed,
2202
+ std::integral_constant< /* std::move_if_noexcept semantics */
2203
+ bool,
2204
+ std::is_nothrow_move_constructible<init_type>::value||
2205
+ !std::is_same<element_type,value_type>::value||
2206
+ !std::is_copy_constructible<element_type>::value>{});
2207
+ }
2208
+
2209
+ void nosize_transfer_element(
2210
+ element_type* p,std::size_t hash,const arrays_type& arrays_,
2211
+ std::size_t& num_destroyed,std::true_type /* ->move */)
2212
+ {
2213
+ /* Destroy p even if an an exception is thrown in the middle of move
2214
+ * construction, which could leave the source half-moved.
2215
+ */
2216
+ ++num_destroyed;
2217
+ destroy_element_on_exit d{this,p};
2218
+ (void)d; /* unused var warning */
2219
+ nosize_unchecked_emplace_at(
2220
+ arrays_,position_for(hash,arrays_),hash,type_policy::move(*p));
2221
+ }
2222
+
2223
+ void nosize_transfer_element(
2224
+ element_type* p,std::size_t hash,const arrays_type& arrays_,
2225
+ std::size_t& /*num_destroyed*/,std::false_type /* ->copy */)
2226
+ {
2227
+ nosize_unchecked_emplace_at(
2228
+ arrays_,position_for(hash,arrays_),hash,
2229
+ const_cast<const element_type&>(*p));
2230
+ }
2231
+
2232
+ template<typename... Args>
2233
+ locator nosize_unchecked_emplace_at(
2234
+ const arrays_type& arrays_,std::size_t pos0,std::size_t hash,
2235
+ Args&&... args)
2236
+ {
2237
+ for(prober pb(pos0);;pb.next(arrays_.groups_size_mask)){
2238
+ auto pos=pb.get();
2239
+ auto pg=arrays_.groups()+pos;
2240
+ auto mask=pg->match_available();
2241
+ if(BOOST_LIKELY(mask!=0)){
2242
+ auto n=unchecked_countr_zero(mask);
2243
+ auto p=arrays_.elements()+pos*N+n;
2244
+ construct_element(p,std::forward<Args>(args)...);
2245
+ pg->set(n,hash);
2246
+ return {pg,n,p};
2247
+ }
2248
+ else pg->mark_overflow(hash);
2249
+ }
2250
+ }
2251
+ };
2252
+
2253
+ #if BOOST_WORKAROUND(BOOST_MSVC,<=1900)
2254
+ #pragma warning(pop) /* C4702 */
2255
+ #endif
2256
+
2257
+ #if defined(BOOST_MSVC)
2258
+ #pragma warning(pop) /* C4714 */
2259
+ #endif
2260
+
2261
+ #include <boost/unordered/detail/foa/restore_wshadow.hpp>
2262
+
2263
+ } /* namespace foa */
2264
+ } /* namespace detail */
2265
+ } /* namespace unordered */
2266
+ } /* namespace boost */
2267
+
2268
+ #undef BOOST_UNORDERED_STATIC_ASSERT_HASH_PRED
2269
+ #undef BOOST_UNORDERED_HAS_FEATURE
2270
+ #undef BOOST_UNORDERED_HAS_BUILTIN
2271
+ #endif