passenger 6.2.1 → 6.2.2

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 (270) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +37 -15
  3. data/build/cxx_tests.rb +2 -0
  4. data/build/support/cxx_dependency_map.rb +3 -63
  5. data/src/agent/Core/Config.h +1 -1
  6. data/src/agent/Core/Controller/Config.h +1 -1
  7. data/src/agent/Shared/ApiServerUtils.h +1 -1
  8. data/src/agent/Watchdog/Config.h +1 -1
  9. data/src/apache2_module/Hooks.cpp +13 -0
  10. data/src/apache2_module/Utils.h +14 -0
  11. data/src/cxx_supportlib/Constants.h +1 -1
  12. data/src/cxx_supportlib/FileTools/FileManip.cpp +27 -3
  13. data/src/cxx_supportlib/InstanceDirectory.h +30 -3
  14. data/src/cxx_supportlib/ServerKit/Errors.h +1 -1
  15. data/src/cxx_supportlib/ServerKit/HttpHeaderParser.h +1 -1
  16. data/src/cxx_supportlib/ServerKit/HttpHeaderParserState.h +1 -1
  17. data/src/cxx_supportlib/ServerKit/HttpRequest.h +1 -1
  18. data/src/cxx_supportlib/ServerKit/llerrors.h +3 -3
  19. data/src/cxx_supportlib/ServerKit/llversion.h +1 -1
  20. data/src/cxx_supportlib/{ServerKit/llhttp_api.c → vendor-copy/llhttp/api.c} +30 -23
  21. data/src/cxx_supportlib/{ServerKit → vendor-copy/llhttp}/llhttp.c +1756 -1645
  22. data/src/cxx_supportlib/{ServerKit → vendor-copy/llhttp}/llhttp.h +35 -13
  23. data/src/cxx_supportlib/vendor-modified/boost/algorithm/string/classification.hpp +19 -0
  24. data/src/cxx_supportlib/vendor-modified/boost/algorithm/string/formatter.hpp +1 -1
  25. data/src/cxx_supportlib/vendor-modified/boost/algorithm/string/trim_all.hpp +0 -2
  26. data/src/cxx_supportlib/vendor-modified/boost/assert.hpp +20 -13
  27. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_gcc_x86.hpp +2 -2
  28. data/src/cxx_supportlib/vendor-modified/boost/atomic/thread_pause.hpp +4 -0
  29. data/src/cxx_supportlib/vendor-modified/boost/bind/mem_fn.hpp +1 -1
  30. data/src/cxx_supportlib/vendor-modified/boost/circular_buffer/debug.hpp +4 -0
  31. data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx03.hpp +1 -1
  32. data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx11.hpp +1 -1
  33. data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx14.hpp +1 -1
  34. data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx17.hpp +1 -1
  35. data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx20.hpp +1 -1
  36. data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx23.hpp +1 -1
  37. data/src/cxx_supportlib/vendor-modified/boost/config/auto_link.hpp +6 -1
  38. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/clang_version.hpp +10 -1
  39. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/visualc.hpp +5 -3
  40. data/src/cxx_supportlib/vendor-modified/boost/config/detail/cxx_composite.hpp +1 -1
  41. data/src/cxx_supportlib/vendor-modified/boost/config/workaround.hpp +5 -0
  42. data/src/cxx_supportlib/vendor-modified/boost/container/adaptive_pool.hpp +57 -53
  43. data/src/cxx_supportlib/vendor-modified/boost/container/allocator.hpp +10 -10
  44. data/src/cxx_supportlib/vendor-modified/boost/container/allocator_traits.hpp +34 -2
  45. data/src/cxx_supportlib/vendor-modified/boost/container/container_fwd.hpp +14 -2
  46. data/src/cxx_supportlib/vendor-modified/boost/container/deque.hpp +176 -2287
  47. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool.hpp +13 -9
  48. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool_impl.hpp +186 -70
  49. data/src/cxx_supportlib/vendor-modified/boost/container/detail/algorithm.hpp +2 -2
  50. data/src/cxx_supportlib/vendor-modified/boost/container/detail/aligned_allocation.hpp +149 -0
  51. data/src/cxx_supportlib/vendor-modified/boost/container/detail/alloc_helpers.hpp +35 -0
  52. data/src/cxx_supportlib/vendor-modified/boost/container/detail/alloc_lib.h +1 -0
  53. data/src/cxx_supportlib/vendor-modified/boost/container/detail/bit_utilities.hpp +133 -0
  54. data/src/cxx_supportlib/vendor-modified/boost/container/detail/compare_functors.hpp +18 -3
  55. data/src/cxx_supportlib/vendor-modified/boost/container/detail/config_begin.hpp +5 -0
  56. data/src/cxx_supportlib/vendor-modified/boost/container/detail/config_end.hpp +4 -0
  57. data/src/cxx_supportlib/vendor-modified/boost/container/detail/container_rebind.hpp +1 -1
  58. data/src/cxx_supportlib/vendor-modified/boost/container/detail/copy_move_algo.hpp +20 -10
  59. data/src/cxx_supportlib/vendor-modified/boost/container/detail/deque_impl.hpp +2744 -0
  60. data/src/cxx_supportlib/vendor-modified/boost/container/detail/dispatch_uses_allocator.hpp +202 -104
  61. data/src/cxx_supportlib/vendor-modified/boost/container/detail/dlmalloc.hpp +5 -4
  62. data/src/cxx_supportlib/vendor-modified/boost/container/detail/flat_tree.hpp +161 -85
  63. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_constructible.hpp +180 -0
  64. data/src/cxx_supportlib/vendor-modified/boost/container/detail/iterators.hpp +3 -2
  65. data/src/cxx_supportlib/vendor-modified/boost/container/detail/math_functions.hpp +12 -0
  66. data/src/cxx_supportlib/vendor-modified/boost/container/detail/mpl.hpp +16 -0
  67. data/src/cxx_supportlib/vendor-modified/boost/container/detail/mutex.hpp +1 -1
  68. data/src/cxx_supportlib/vendor-modified/boost/container/detail/next_capacity.hpp +9 -1
  69. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_pool.hpp +18 -14
  70. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_pool_impl.hpp +256 -41
  71. data/src/cxx_supportlib/vendor-modified/boost/container/detail/operator_new_helpers.hpp +75 -24
  72. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pair.hpp +1 -56
  73. data/src/cxx_supportlib/vendor-modified/boost/container/detail/placement_new.hpp +16 -3
  74. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_common_alloc.hpp +1 -7
  75. data/src/cxx_supportlib/vendor-modified/boost/container/detail/range_utils.hpp +196 -0
  76. data/src/cxx_supportlib/vendor-modified/boost/container/detail/std_fwd.hpp +33 -1
  77. data/src/cxx_supportlib/vendor-modified/boost/container/detail/tree.hpp +124 -69
  78. data/src/cxx_supportlib/vendor-modified/boost/container/detail/workaround.hpp +109 -7
  79. data/src/cxx_supportlib/vendor-modified/boost/container/devector.hpp +168 -162
  80. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/nest.hpp +2978 -0
  81. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/pmr/nest.hpp +45 -0
  82. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_all_of.hpp +43 -0
  83. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_any_of.hpp +42 -0
  84. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_copy.hpp +229 -0
  85. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_copy_if.hpp +270 -0
  86. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_copy_n.hpp +308 -0
  87. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_count.hpp +101 -0
  88. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_count_if.hpp +100 -0
  89. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_equal.hpp +268 -0
  90. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_fill.hpp +101 -0
  91. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_fill_n.hpp +171 -0
  92. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_find.hpp +110 -0
  93. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_find_if.hpp +110 -0
  94. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_find_if_not.hpp +43 -0
  95. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_find_last.hpp +179 -0
  96. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_find_last_if.hpp +179 -0
  97. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_find_last_if_not.hpp +43 -0
  98. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_for_each.hpp +92 -0
  99. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_generate.hpp +90 -0
  100. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_generate_n.hpp +162 -0
  101. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_is_partitioned.hpp +46 -0
  102. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_is_sorted.hpp +49 -0
  103. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_is_sorted_until.hpp +169 -0
  104. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_iterator_traits.hpp +382 -0
  105. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_merge.hpp +428 -0
  106. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_mismatch.hpp +350 -0
  107. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_none_of.hpp +98 -0
  108. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_partition.hpp +296 -0
  109. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_partition_copy.hpp +105 -0
  110. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_partition_point.hpp +116 -0
  111. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_remove.hpp +57 -0
  112. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_remove_copy.hpp +207 -0
  113. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_remove_copy_if.hpp +223 -0
  114. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_remove_if.hpp +57 -0
  115. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_replace.hpp +90 -0
  116. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_replace_if.hpp +90 -0
  117. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_reverse.hpp +245 -0
  118. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_reverse_copy.hpp +229 -0
  119. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_search.hpp +211 -0
  120. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_search_n.hpp +476 -0
  121. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_set_difference.hpp +300 -0
  122. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_set_intersection.hpp +287 -0
  123. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_set_symmetric_difference.hpp +306 -0
  124. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_set_union.hpp +294 -0
  125. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_stable_partition.hpp +153 -0
  126. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_swap_ranges.hpp +92 -0
  127. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_transform.hpp +93 -0
  128. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/wrapped_iterator.hpp +142 -0
  129. data/src/cxx_supportlib/vendor-modified/boost/container/flat_map.hpp +642 -417
  130. data/src/cxx_supportlib/vendor-modified/boost/container/flat_set.hpp +141 -30
  131. data/src/cxx_supportlib/vendor-modified/boost/container/hub.hpp +2426 -0
  132. data/src/cxx_supportlib/vendor-modified/boost/container/list.hpp +65 -57
  133. data/src/cxx_supportlib/vendor-modified/boost/container/map.hpp +247 -68
  134. data/src/cxx_supportlib/vendor-modified/boost/container/new_allocator.hpp +7 -0
  135. data/src/cxx_supportlib/vendor-modified/boost/container/node_allocator.hpp +39 -33
  136. data/src/cxx_supportlib/vendor-modified/boost/container/options.hpp +156 -23
  137. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/global_resource.hpp +3 -3
  138. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/hub.hpp +43 -0
  139. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/memory_resource.hpp +5 -3
  140. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/monotonic_buffer_resource.hpp +1 -0
  141. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/polymorphic_allocator.hpp +1 -1
  142. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/resource_adaptor.hpp +4 -0
  143. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/segtor.hpp +45 -0
  144. data/src/cxx_supportlib/vendor-modified/boost/container/scoped_allocator.hpp +5 -4
  145. data/src/cxx_supportlib/vendor-modified/boost/container/segtor.hpp +905 -0
  146. data/src/cxx_supportlib/vendor-modified/boost/container/set.hpp +148 -35
  147. data/src/cxx_supportlib/vendor-modified/boost/container/slist.hpp +59 -52
  148. data/src/cxx_supportlib/vendor-modified/boost/container/small_vector.hpp +632 -5
  149. data/src/cxx_supportlib/vendor-modified/boost/container/stable_vector.hpp +66 -60
  150. data/src/cxx_supportlib/vendor-modified/boost/container/static_vector.hpp +46 -1
  151. data/src/cxx_supportlib/vendor-modified/boost/container/string.hpp +612 -317
  152. data/src/cxx_supportlib/vendor-modified/boost/container/uses_allocator.hpp +54 -111
  153. data/src/cxx_supportlib/vendor-modified/boost/container/uses_allocator_construction.hpp +100 -0
  154. data/src/cxx_supportlib/vendor-modified/boost/container/uses_allocator_fwd.hpp +1 -3
  155. data/src/cxx_supportlib/vendor-modified/boost/container/vector.hpp +233 -116
  156. data/src/cxx_supportlib/vendor-modified/boost/container_hash/hash.hpp +5 -1
  157. data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test.hpp +17 -10
  158. data/src/cxx_supportlib/vendor-modified/boost/date_time/period.hpp +1 -3
  159. data/src/cxx_supportlib/vendor-modified/boost/describe/detail/config.hpp +16 -0
  160. data/src/cxx_supportlib/vendor-modified/boost/exception/detail/encoder.hpp +114 -0
  161. data/src/cxx_supportlib/vendor-modified/boost/exception/detail/error_info_impl.hpp +4 -0
  162. data/src/cxx_supportlib/vendor-modified/boost/exception/detail/requires_cxx11.hpp +1 -1
  163. data/src/cxx_supportlib/vendor-modified/boost/exception/detail/type_info.hpp +211 -1
  164. data/src/cxx_supportlib/vendor-modified/boost/exception/diagnostic_information.hpp +59 -0
  165. data/src/cxx_supportlib/vendor-modified/boost/exception/exception.hpp +6 -0
  166. data/src/cxx_supportlib/vendor-modified/boost/exception/info.hpp +34 -0
  167. data/src/cxx_supportlib/vendor-modified/boost/intrusive/avltree.hpp +0 -1
  168. data/src/cxx_supportlib/vendor-modified/boost/intrusive/bstree.hpp +12 -3
  169. data/src/cxx_supportlib/vendor-modified/boost/intrusive/derivation_value_traits.hpp +1 -1
  170. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/ebo_functor_holder.hpp +29 -174
  171. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/generic_hook.hpp +18 -2
  172. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/key_nodeptr_comp.hpp +0 -1
  173. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/workaround.hpp +4 -5
  174. data/src/cxx_supportlib/vendor-modified/boost/intrusive/hashtable.hpp +20 -11
  175. data/src/cxx_supportlib/vendor-modified/boost/intrusive/list.hpp +42 -14
  176. data/src/cxx_supportlib/vendor-modified/boost/intrusive/slist.hpp +58 -22
  177. data/src/cxx_supportlib/vendor-modified/boost/intrusive/unordered_set.hpp +3 -1
  178. data/src/cxx_supportlib/vendor-modified/boost/iterator/advance.hpp +5 -1
  179. data/src/cxx_supportlib/vendor-modified/boost/iterator/distance.hpp +8 -2
  180. data/src/cxx_supportlib/vendor-modified/boost/iterator/is_iterator.hpp +9 -0
  181. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/bad_lexical_cast.hpp +11 -1
  182. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/buffer_view.hpp +9 -1
  183. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/config.hpp +22 -0
  184. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical.hpp +15 -7
  185. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical_streams.hpp +23 -11
  186. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_numeric.hpp +11 -1
  187. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/inf_nan.hpp +9 -1
  188. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/is_character.hpp +11 -2
  189. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_basic_unlockedbuf.hpp +10 -1
  190. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_char_constants.hpp +8 -1
  191. data/src/cxx_supportlib/vendor-modified/boost/{detail → lexical_cast/detail}/lcast_precision.hpp +13 -1
  192. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_unsigned_converters.hpp +11 -1
  193. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/widest_char.hpp +10 -2
  194. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/try_lexical_convert.hpp +15 -2
  195. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast.hpp +11 -1
  196. data/src/cxx_supportlib/vendor-modified/boost/libs/thread/src/pthread/once_atomic.cpp +1 -1
  197. data/src/cxx_supportlib/vendor-modified/boost/libs/thread/src/pthread/thread.cpp +48 -46
  198. data/src/cxx_supportlib/vendor-modified/boost/move/detail/meta_utils.hpp +23 -0
  199. data/src/cxx_supportlib/vendor-modified/boost/move/detail/move_helpers.hpp +24 -24
  200. data/src/cxx_supportlib/vendor-modified/boost/move/detail/nsec_clock.hpp +12 -4
  201. data/src/cxx_supportlib/vendor-modified/boost/move/detail/type_traits.hpp +76 -0
  202. data/src/cxx_supportlib/vendor-modified/boost/move/detail/workaround.hpp +1 -1
  203. data/src/cxx_supportlib/vendor-modified/boost/move/traits.hpp +11 -0
  204. data/src/cxx_supportlib/vendor-modified/boost/mp11/algorithm.hpp +58 -37
  205. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_copy_if.hpp +1 -2
  206. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_map_find.hpp +17 -9
  207. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_remove_if.hpp +1 -2
  208. data/src/cxx_supportlib/vendor-modified/boost/mp11/integer_sequence.hpp +6 -0
  209. data/src/cxx_supportlib/vendor-modified/boost/mp11/version.hpp +1 -1
  210. data/src/cxx_supportlib/vendor-modified/boost/none_t.hpp +6 -1
  211. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_common_defs.hpp +188 -0
  212. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_factory_support.hpp +0 -6
  213. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_hash.hpp +1 -1
  214. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_nonmember_interface.hpp +117 -0
  215. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_reference_spec.hpp +108 -83
  216. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_relops.hpp +39 -39
  217. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_select_implementation.hpp +37 -0
  218. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_swap.hpp +1 -1
  219. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_trivially_copyable_base.hpp +8 -8
  220. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/union_optional.hpp +724 -0
  221. data/src/cxx_supportlib/vendor-modified/boost/optional/optional.hpp +93 -220
  222. data/src/cxx_supportlib/vendor-modified/boost/optional/optional_fwd.hpp +14 -4
  223. data/src/cxx_supportlib/vendor-modified/boost/optional/optional_io.hpp +1 -1
  224. data/src/cxx_supportlib/vendor-modified/boost/random/binomial_distribution.hpp +1 -1
  225. data/src/cxx_supportlib/vendor-modified/boost/random/uniform_int_distribution.hpp +1 -1
  226. data/src/cxx_supportlib/vendor-modified/boost/rational.hpp +1 -1
  227. data/src/cxx_supportlib/vendor-modified/boost/static_assert.hpp +4 -6
  228. data/src/cxx_supportlib/vendor-modified/boost/system/api_config.hpp +1 -1
  229. data/src/cxx_supportlib/vendor-modified/boost/system/detail/config.hpp +16 -0
  230. data/src/cxx_supportlib/vendor-modified/boost/system/detail/error_category.hpp +13 -13
  231. data/src/cxx_supportlib/vendor-modified/boost/system/detail/error_category_impl.hpp +5 -5
  232. data/src/cxx_supportlib/vendor-modified/boost/thread/concurrent_queues/detail/sync_deque_base.hpp +3 -2
  233. data/src/cxx_supportlib/vendor-modified/boost/thread/concurrent_queues/detail/sync_queue_base.hpp +3 -2
  234. data/src/cxx_supportlib/vendor-modified/boost/thread/detail/thread.hpp +2 -1
  235. data/src/cxx_supportlib/vendor-modified/boost/thread/experimental/parallel/v2/task_region.hpp +1 -1
  236. data/src/cxx_supportlib/vendor-modified/boost/thread/future.hpp +30 -28
  237. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/once.hpp +6 -3
  238. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/once_atomic.hpp +5 -1
  239. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/pthread_helpers.hpp +1 -0
  240. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/shared_mutex.hpp +16 -16
  241. data/src/cxx_supportlib/vendor-modified/boost/thread/v2/shared_mutex.hpp +26 -26
  242. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map.hpp +196 -6
  243. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_set.hpp +191 -6
  244. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_node_map.hpp +196 -5
  245. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_node_set.hpp +192 -5
  246. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/concurrent_table.hpp +3 -3
  247. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/core.hpp +2 -2
  248. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/table.hpp +3 -3
  249. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/implementation.hpp +52 -16
  250. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/ranges_support.hpp +104 -0
  251. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/type_traits.hpp +1 -14
  252. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/unordered_printers.hpp +10 -4
  253. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map.hpp +121 -3
  254. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set.hpp +118 -3
  255. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_map.hpp +338 -1
  256. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map.hpp +121 -3
  257. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set.hpp +118 -3
  258. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_set.hpp +333 -1
  259. data/src/cxx_supportlib/vendor-modified/boost/version.hpp +2 -2
  260. data/src/cxx_supportlib/vendor-modified/jsoncpp/json-forwards.h +276 -143
  261. data/src/cxx_supportlib/vendor-modified/jsoncpp/json.h +1262 -771
  262. data/src/cxx_supportlib/vendor-modified/jsoncpp/jsoncpp.cpp +1704 -1586
  263. data/src/nginx_module/ContentHandler.c +35 -0
  264. data/src/ruby_supportlib/phusion_passenger/common_library.rb +6 -6
  265. data/src/ruby_supportlib/phusion_passenger/utils/json.rb +25 -2
  266. data/src/ruby_supportlib/phusion_passenger/vendor/daemon_controller.rb +12 -1
  267. data/src/ruby_supportlib/phusion_passenger.rb +1 -1
  268. metadata +73 -8
  269. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_utility.hpp +0 -41
  270. /data/src/cxx_supportlib/{ServerKit/llhttp_http.c → vendor-copy/llhttp/http.c} +0 -0
@@ -0,0 +1,476 @@
1
+ //////////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // (C) Copyright Ion Gaztanaga 2025-2026. Distributed under the Boost
4
+ // Software License, Version 1.0. (See accompanying file
5
+ // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6
+ //
7
+ // See http://www.boost.org/libs/container for documentation.
8
+ //
9
+ //////////////////////////////////////////////////////////////////////////////
10
+ #ifndef BOOST_CONTAINER_EXPERIMENTAL_SEGMENTED_SEARCH_N_HPP
11
+ #define BOOST_CONTAINER_EXPERIMENTAL_SEGMENTED_SEARCH_N_HPP
12
+
13
+ #ifndef BOOST_CONFIG_HPP
14
+ # include <boost/config.hpp>
15
+ #endif
16
+
17
+ #if defined(BOOST_HAS_PRAGMA_ONCE)
18
+ # pragma once
19
+ #endif
20
+
21
+ #include <boost/container/detail/config_begin.hpp>
22
+ #include <boost/container/detail/workaround.hpp>
23
+ #include <boost/container/experimental/segmented_iterator_traits.hpp>
24
+ #include <boost/container/experimental/segmented_find.hpp>
25
+
26
+ namespace boost {
27
+ namespace container {
28
+
29
+ template <class FwdIt, class Sent, class Size, class T>
30
+ FwdIt segmented_search_n
31
+ (FwdIt first, Sent last, Size count, const T& BOOST_RESTRICT value);
32
+
33
+ namespace detail_algo {
34
+
35
+ // search_n_scan_segment scans a single (sub-)segment for a run of "count"
36
+ // consecutive elements equal to "value", threading cross-segment state
37
+ // through the "consecutive" parameter. The result is a segtrio:
38
+ //
39
+ // first : true if the full run was completed inside this scan
40
+ // second : current consecutive count at end of scan (carries to next segment)
41
+ // third : start of the run when first==true; otherwise the position where
42
+ // a new run started inside this scan, or "lend" (sentinel) when
43
+ // no new run started in this scan (i.e. the in-progress run, if
44
+ // any, started in a previous segment).
45
+ //
46
+ // Used both as the recursive worker driving segmented walks and as the
47
+ // single entry point invoked by segmented_search_n.
48
+
49
+ // (non-segmented, random-access, same-typed iterators)
50
+ // Boyer-Moore-style "skip-by-count" scan with cross-segment carry-over.
51
+ //
52
+ // Phase 1: if "consecutive" carries a partial run from the previous
53
+ // segment, probe at "lcur + ncheck - 1" (the last position needed to
54
+ // complete the carry-over, clamped by the segment) and verify
55
+ // backward on a hit. On success return; on a mismatch reset
56
+ // "consecutive" to 0 and fall through to phase 2 from the position
57
+ // past the mismatch -- with "consecutive > 0", no in-segment run can
58
+ // start at or before the probe, so the entire range up to the probe
59
+ // can be skipped without inspection on a probe miss.
60
+ // Phase 2: probe at "lcur + (count - 1)". On match, verify backward to
61
+ // find the run start; on mismatch advance the probe by "count"
62
+ // positions instead of 1 (Boyer-Moore). The mismatched element cannot
63
+ // belong to any complete run that fits in [probe - count + 1, probe],
64
+ // so the next candidate run can only start past it. This makes the
65
+ // scan O(n / count) on the value-sparse portion of the range.
66
+ // Phase 3: once "probe >= lend", scan the tail to detect a partial
67
+ // trailing run that the next segment may extend. Bounded by phase 2's
68
+ // exit position: "*(probe - count) != value" is known, so the scan
69
+ // range is (probe - count, lend) of length "lend - probe + count - 1",
70
+ // which is in [0, count - 1] -- often well below count - 1, and
71
+ // exactly 0 when the last probe landed at "lend - 1" and missed.
72
+ template <class LocalIter, class Size, class T>
73
+ segtrio<bool, Size, LocalIter> search_n_scan_segment
74
+ (LocalIter lcur, LocalIter const lend,
75
+ Size consecutive, Size count, const T& BOOST_RESTRICT value,
76
+ const non_segmented_iterator_tag &, const std::random_access_iterator_tag &)
77
+ {
78
+ typedef segtrio<bool, Size, LocalIter> result_t;
79
+ typedef typename iterator_traits<LocalIter>::difference_type difference_type;
80
+
81
+ // Phase 1: extend a partial run (consecutive > 0) carried from the previous segment.
82
+ //
83
+ // Single-cursor verify mirroring phase 2's V3 shape: `lcur` is stepped
84
+ // to "verify_probe = original_lcur + ncheck - 1" (the last position the
85
+ // carry-over needs to cover) and the inner loop sweeps the ncheck
86
+ // positions [original_lcur, verify_probe] backward via "--lcur".
87
+ //
88
+ // OOB safety: exactly ncheck - 1 decrements (not ncheck) are executed
89
+ // on the full-match path, exiting via "if (--left == 0)" before the
90
+ // final --lcur. This avoids forming "original_lcur - 1" -- UB for raw
91
+ // pointers, which the segmented deque path always supplies as
92
+ // chunk-start pointers.
93
+ if(consecutive > 0) {
94
+ // Handles the case where the segment too short to complete the run.
95
+ const difference_type need = static_cast<difference_type>(count - consecutive);
96
+ const difference_type avail = lend - lcur;
97
+ const difference_type ncheck = need < avail ? need : avail;
98
+ if(BOOST_UNLIKELY(ncheck == 0)) // Empty segment; carry-over preserved for the next one.
99
+ return result_t(false, consecutive, lend);
100
+
101
+ // Step "lcur" itself to the verify probe position; no separate cursor.
102
+ lcur += (ncheck - 1);
103
+ Size left = static_cast<Size>(ncheck);
104
+ BOOST_CONTAINER_UNROLL(4)
105
+ do {
106
+ if(!(*lcur == value))
107
+ goto phase1_mismatch; // Mismatch, jump to cleanup logic
108
+ if (--left == 0) {
109
+ goto full_match;
110
+ }
111
+ --lcur;
112
+ } while(true);
113
+
114
+ full_match:
115
+ // Full backwards verification: run start = original_lcur.
116
+ // Put "start of the run" return to sentinel so the outer
117
+ // match_start is not updated.
118
+ consecutive += static_cast<Size>(ncheck);
119
+ return result_t(consecutive == count, consecutive, lend);
120
+
121
+ // Mismatch, reset consecutive counter and step past the failing position.
122
+ phase1_mismatch:
123
+ consecutive = 0;
124
+ ++lcur;
125
+ }
126
+
127
+ const difference_type dcount = static_cast<difference_type>(count);
128
+ const difference_type remaining = lend - lcur;
129
+
130
+ // Phase 2: Only meaningful if a full run fits (dcount <= remaining)
131
+ // No partial run. Skip-by-count probing.
132
+ //
133
+ // Single-cursor Boyer-Moore: at the top of each outer iteration `lcur`
134
+ // sits at the verify probe position. The inner verify checks *lcur
135
+ // (its first iteration replaces an outer "if(*probe == value)" gate)
136
+ // then walks down via "--lcur", sweeping the count positions
137
+ // [verify_probe - (count - 1), verify_probe].
138
+ //
139
+ // After an inner mismatch at iter K (K in [1, count]) `lcur` lands at
140
+ // LKNM = verify_probe - (K - 1); the next outer iter's verify_probe is
141
+ // verify_probe + (count - K + 1), so the advance from LKNM is
142
+ // (count - K + 1) + (K - 1) = count -- a constant `dcount`, regardless
143
+ // of K. The BM acceleration is entirely encoded in how far the inner
144
+ // loop decrements `lcur` before mismatching, and the outer step is just
145
+ // dcount.
146
+ //
147
+ // OOB safety: `lend_safe = lend - dcount` is precomputed once (well-formed
148
+ // because dcount <= remaining = lend - original_lcur). The guard
149
+ // `lcur >= lend_safe` is a pointer comparison only -- no new pointer is
150
+ // ever formed past `lend`. When `lcur < lend_safe`, `lcur + dcount`
151
+ // lands at most at `lend - 1`, which is dereferenceable.
152
+ if(dcount <= remaining) {
153
+ // First verify probe: original_lcur + dcount - 1, in [original_lcur, lend).
154
+ lcur += (dcount - 1);
155
+ const LocalIter lend_safe = lend - dcount; // largest lcur that can advance
156
+ while (true) {
157
+ // Inner verify sweeps the count positions [verify_probe - (count - 1),
158
+ // verify_probe] backward. Doing exactly count - 1 decrements (not
159
+ // count) avoids forming "original_lcur - 1" when the run lands
160
+ // right at the start of the segment.
161
+ Size left = count;
162
+ BOOST_CONTAINER_UNROLL(4)
163
+ do { //count is always >= 2 because it's tested in the outer function
164
+ if(!(*lcur == value))
165
+ goto phase2_mismatch;
166
+ if (--left == 0)
167
+ // Run start: lcur = verify_probe - (count - 1).
168
+ return result_t(true, count, lcur);
169
+ --lcur;
170
+ } while (true);
171
+
172
+ phase2_mismatch: ;
173
+ // lcur at LKNM (failed check). OOB-safe advance to next verify probe.
174
+ if (lcur >= lend_safe)
175
+ break;
176
+ lcur += dcount;
177
+ }
178
+ // Exit: lcur at LKNM. The phase-3 tail scan starts one past it.
179
+ ++lcur;
180
+ }
181
+
182
+ // Phase 3: partial trailing run that could extend into the next segment.
183
+ //
184
+ // Scans [lcur, lend) backward. Mirrors phase 2's verify-loop pattern
185
+ {
186
+ LocalIter tail = lend;
187
+ if (tail == lcur) // empty tail, nothing to scan.
188
+ return result_t(false, 0, lend);
189
+
190
+ BOOST_CONTAINER_UNROLL(4)
191
+ do {
192
+ --tail;
193
+ if (!(*tail == value))
194
+ goto tail_mismatch;
195
+ } while (tail != lcur);
196
+
197
+ // Full tail run: every element in [lcur, lend) equals value.
198
+ // tail == lcur and (lend - lcur) > 0, so the run is non-empty.
199
+ return result_t(false, static_cast<Size>(lend - tail), tail);
200
+
201
+ // Mismatch at "tail"; the partial run starts one past it. On a
202
+ // first-iteration mismatch ("*(lend - 1) != value") the post-"++tail"
203
+ // value collapses to "lend", which the caller already interprets as
204
+ // "no match position" via "r.third != lend", so the assignment is
205
+ // safe to do unconditionally.
206
+ tail_mismatch:
207
+ LocalIter match_start = tail;
208
+ ++match_start;
209
+ return result_t(false, static_cast<Size>(lend - tail), match_start);
210
+ }
211
+ }
212
+
213
+ // Initial value for "match_start" used by the forward scan below.
214
+ //
215
+ // When invoked with same-typed iterators (the recursive segmented caller's
216
+ // path) we return "lend" so the caller can detect "no new run started in
217
+ // this scan" via "r.third != lend". With a real sentinel this trick isn't
218
+ // available (Sent cannot be assigned to LocalIter), but it isn't needed
219
+ // either: that path is reached only at the top level, where the caller only
220
+ // consults "r.third" when "r.first == true", in which case "match_start"
221
+ // has been set to a real position inside the loop.
222
+ template <class LocalIter>
223
+ BOOST_CONTAINER_FORCEINLINE
224
+ LocalIter search_n_init_match_start(LocalIter, LocalIter lend) { return lend; }
225
+
226
+ template <class LocalIter, class Sent>
227
+ BOOST_CONTAINER_FORCEINLINE
228
+ typename algo_enable_if_c<is_sentinel<Sent, LocalIter>::value, LocalIter>::type
229
+ search_n_init_match_start(LocalIter lcur, Sent) { return lcur; }
230
+
231
+ // Forward scan: handles both the same-typed (recursive segmented caller) and
232
+ // the real-sentinel (top-level) cases with one body. The only behavioral
233
+ // difference -- the initial value of "match_start" -- is folded into the
234
+ // search_n_init_match_start helper above.
235
+ template <class LocalIter, class Sent, class Size, class T, class Tag, class Cat>
236
+ BOOST_CONTAINER_FORCEINLINE
237
+ typename algo_enable_if_c<!Tag::value || is_sentinel<Sent, LocalIter>::value,
238
+ segtrio<bool, Size, LocalIter> >::type
239
+ search_n_scan_segment
240
+ (LocalIter lcur, Sent lend,
241
+ Size consecutive, Size count, const T& BOOST_RESTRICT value, Tag, Cat)
242
+ {
243
+ typedef segtrio<bool, Size, LocalIter> result_t;
244
+
245
+ LocalIter match_start = search_n_init_match_start(lcur, lend);
246
+
247
+ BOOST_CONTAINER_SEGMENTED_UNROLL(4)
248
+ for(; lcur != lend; ++lcur) {
249
+ if(*lcur == value) {
250
+ if(consecutive == 0)
251
+ match_start = lcur;
252
+ ++consecutive;
253
+ if(consecutive == count)
254
+ return result_t(true, consecutive, match_start);
255
+ }
256
+ else {
257
+ consecutive = 0;
258
+ }
259
+ }
260
+ return result_t(false, consecutive, match_start);
261
+ }
262
+
263
+ // (segmented, same-typed iterators)
264
+ // Walks sub-segments and recursively delegates to search_n_scan_segment so
265
+ // that every level of segmentation is exploited and the innermost level
266
+ // gets the RA fast path. Cross-segment state (consecutive count and
267
+ // match_start) is threaded through the segtrio result.
268
+ template <class SegIter, class Size, class T, class Cat>
269
+ segtrio<bool, Size, SegIter> search_n_scan_segment
270
+ (SegIter first, SegIter last,
271
+ Size consecutive, Size count, const T& BOOST_RESTRICT value,
272
+ segmented_iterator_tag, Cat)
273
+ {
274
+ typedef segmented_iterator_traits<SegIter> traits;
275
+ typedef typename traits::segment_iterator segment_iterator;
276
+ typedef typename traits::local_iterator local_iterator;
277
+ typedef typename segmented_iterator_traits<local_iterator>::is_segmented_iterator is_local_seg_t;
278
+ typedef typename iterator_traits<local_iterator>::iterator_category local_cat_t;
279
+
280
+ typedef segtrio<bool, Size, local_iterator> sub_result_t;
281
+ typedef segtrio<bool, Size, SegIter> result_t;
282
+
283
+ SegIter match_start = last;
284
+
285
+ segment_iterator scur = traits::segment(first);
286
+ segment_iterator slast = traits::segment(last);
287
+
288
+ if(scur == slast) {
289
+ local_iterator lend = traits::local(last);
290
+ const sub_result_t r = search_n_scan_segment(traits::local(first), lend,
291
+ consecutive, count, value, is_local_seg_t(), local_cat_t());
292
+ if(r.third != lend)
293
+ match_start = traits::compose(scur, r.third);
294
+ return result_t(r.first, r.second, match_start);
295
+ }
296
+ else {
297
+ local_iterator lend = traits::end(scur);
298
+ sub_result_t r = search_n_scan_segment(traits::local(first), lend,
299
+ consecutive, count, value, is_local_seg_t(), local_cat_t());
300
+ if(r.third != lend)
301
+ match_start = traits::compose(scur, r.third);
302
+ if(r.first)
303
+ return result_t(true, r.second, match_start);
304
+
305
+ for(++scur; scur != slast; ++scur) {
306
+ lend = traits::end(scur);
307
+ r = search_n_scan_segment(traits::begin(scur), lend,
308
+ r.second, count, value, is_local_seg_t(), local_cat_t());
309
+ if(r.third != lend)
310
+ match_start = traits::compose(scur, r.third);
311
+ if(r.first)
312
+ return result_t(true, r.second, match_start);
313
+ }
314
+ {
315
+ lend = traits::local(last);
316
+ r = search_n_scan_segment(traits::begin(scur), lend,
317
+ r.second, count, value, is_local_seg_t(), local_cat_t());
318
+ if(r.third != lend)
319
+ match_start = traits::compose(scur, r.third);
320
+ return result_t(r.first, r.second, match_start);
321
+ }
322
+ }
323
+ }
324
+
325
+ // Cheap O(1) size guard available when first/last are a same-typed RA pair.
326
+ template <class FwdIt, class Size>
327
+ BOOST_CONTAINER_FORCEINLINE
328
+ bool search_n_range_shorter_than
329
+ (FwdIt first, FwdIt last, Size count, const std::random_access_iterator_tag &)
330
+ {
331
+ typedef typename iterator_traits<FwdIt>::difference_type difference_type;
332
+ return (last - first) < static_cast<difference_type>(count);
333
+ }
334
+
335
+ template <class FwdIt, class Sent, class Size, class Cat>
336
+ BOOST_CONTAINER_FORCEINLINE
337
+ bool search_n_range_shorter_than
338
+ (FwdIt, Sent, Size, Cat)
339
+ {
340
+ return false;
341
+ }
342
+
343
+ // Top-level dispatch for the count >= 2 case.
344
+ //
345
+ // Generic fallback: delegates to the recursive walker via search_n_scan_segment
346
+ // and unwraps the segtrio.
347
+ template <class FwdIt, class Sent, class Size, class T, class Tag, class Cat>
348
+ BOOST_CONTAINER_FORCEINLINE
349
+ FwdIt search_n_top_dispatch
350
+ (FwdIt first, Sent last, Size count, const T& BOOST_RESTRICT value, Tag tag, Cat cat)
351
+ {
352
+ const segtrio<bool, Size, FwdIt> r = search_n_scan_segment
353
+ (first, last, (Size)0, count, value, tag, cat);
354
+ if (r.first)
355
+ return r.third;
356
+ return last;
357
+ }
358
+
359
+ // Top-level non-segmented RA fast path. Phase 1 (carry-over from a previous
360
+ // segment) is dead because "consecutive == 0" at the top level. Phase 3
361
+ // (trailing partial run that the next segment may extend) is dead because
362
+ // there is no next segment. Reduces to pure Boyer-Moore skip-by-count
363
+ // probing, returning the iterator directly without going through the
364
+ // segtrio packaging. Picked over the generic overload by partial ordering
365
+ // when the iterator is non-segmented, RA, and same-typed (FwdIt == Sent).
366
+ //
367
+ // Driven by a running probe iterator advanced in place: for chunked
368
+ // iterators (e.g. wrapped deque_iterator) this collapses to a single
369
+ // register add inside a chunk, with chunk-boundary work amortized over
370
+ // chunk_size/count probes -- vastly cheaper than recomputing
371
+ // "first + pidx" (which forces a chunk-base load on the critical path of
372
+ // every probe).
373
+ template <class FwdIt, class Size, class T>
374
+ BOOST_CONTAINER_FORCEINLINE
375
+ FwdIt search_n_top_dispatch
376
+ (FwdIt first, const FwdIt last, Size count, const T& BOOST_RESTRICT value,
377
+ const non_segmented_iterator_tag &, const std::random_access_iterator_tag &)
378
+ {
379
+ typedef typename iterator_traits<FwdIt>::difference_type difference_type;
380
+ const difference_type dcount = static_cast<difference_type>(count);
381
+ // dcount <= last - first guaranteed by search_n_range_shorter_than.
382
+ //
383
+ // Single-cursor Boyer-Moore: `first` (a by-value parameter, private to
384
+ // this frame) is repurposed as the running probe. After the initial
385
+ // advance to "first + dcount - 1" it no longer means "start of the
386
+ // search range" -- it tracks the verify probe through the rest of the
387
+ // function. `last_safe = last - dcount` is precomputed before the
388
+ // mutation while `first` still names the original lower bound.
389
+ //
390
+ // The inner verify checks *first (its first iteration replaces the old
391
+ // "if (*probe == value)" outer check) then walks down via "--first",
392
+ // sweeping the count positions [verify_probe - (count - 1), verify_probe].
393
+ //
394
+ // After an inner mismatch at iter K (K in [1, count]) `first` lands at
395
+ // LKNM = verify_probe - (K - 1); the next outer iter's verify_probe is
396
+ // verify_probe + (count - K + 1), so the advance from LKNM is
397
+ // (count - K + 1) + (K - 1) = count -- a constant `dcount`, regardless
398
+ // of K. So the BM acceleration is entirely encoded in how far the inner
399
+ // loop decrements `first` before mismatching, and the outer step is just
400
+ // dcount.
401
+ //
402
+ // OOB safety: the guard `first >= last_safe` is a pure pointer
403
+ // comparison -- no new pointer is ever formed past `last`. When
404
+ // `first < last_safe`, `first + dcount` lands at most at `last - 1`,
405
+ // which is dereferenceable.
406
+ const FwdIt last_safe = last - dcount; // largest probe pos that can advance
407
+ first += (dcount - 1); // first becomes the verify probe
408
+ while (true) {
409
+ // Inner verify sweeps the count positions [verify_probe - (count - 1),
410
+ // verify_probe] backward. Doing exactly count - 1 decrements (not
411
+ // count) avoids forming "original_first - 1" when the run lands right
412
+ // at the start of the range -- the OLD `back = probe; Size left =
413
+ // count - 1` shape, but with `first` itself as the cursor.
414
+ Size left = count;
415
+ BOOST_CONTAINER_UNROLL(4)
416
+ do {
417
+ if (!(*first == value))
418
+ goto probe_mismatch;
419
+ if (--left == 0)
420
+ return first; // run start: first = verify_probe - (count - 1)
421
+ --first;
422
+ } while (true);
423
+
424
+ probe_mismatch: ;
425
+ // first at LKNM (failed check). OOB-safe advance to next verify probe:
426
+ // last_safe = last - dcount is precomputed, so the test forms no new
427
+ // pointer. When first < last_safe, first + dcount lands at most at
428
+ // last - 1, which is dereferenceable.
429
+ if (first >= last_safe)
430
+ return last;
431
+ first += dcount;
432
+ }
433
+ }
434
+
435
+ } // namespace detail_algo
436
+
437
+ //! Finds the first occurrence of \c count consecutive elements equal to \c value
438
+ //! in [first, last). Returns an iterator to the start of the run, or \c last if not found.
439
+ //!
440
+ //! Trivial counts (<= 0 or == 1) are handled directly. Otherwise an O(1) size
441
+ //! guard is applied when available, then the work is delegated to
442
+ //! search_n_scan_segment with consecutive=0. Partial ordering routes to the
443
+ //! right overload by tag (segmented walker, non-seg RA skip-by-count, or
444
+ //! forward/sentinel scan), and the segtrio is unwrapped to the public
445
+ //! iterator return.
446
+ template <class FwdIt, class Sent, class Size, class T>
447
+ inline FwdIt segmented_search_n
448
+ (FwdIt first, Sent last, Size count, const T& BOOST_RESTRICT value)
449
+ {
450
+ typedef segmented_iterator_traits<FwdIt> traits;
451
+ typedef typename traits::is_segmented_iterator is_seg_t;
452
+ typedef typename iterator_traits<FwdIt>::iterator_category cat_t;
453
+
454
+ if (BOOST_UNLIKELY(count <= 0))
455
+ return first;
456
+ else if (count == 1) {
457
+ return detail_algo::segmented_find_dispatch(first, last, value, is_seg_t(), cat_t());
458
+ }
459
+ else if (BOOST_UNLIKELY(detail_algo::search_n_range_shorter_than(first, last, count, cat_t())))
460
+ return last;
461
+ else {
462
+ // count >= 2. Tag-dispatched: non-segmented RA top-level calls take a Phase-2-only
463
+ // fast path (Phase 1 is dead because "consecutive == 0" and Phase 3
464
+ // is dead because there is no next segment). Otherwise (segmented,
465
+ // forward-only, sentinel) the generic overload delegates to
466
+ // search_n_scan_segment + segtrio unwrap.
467
+ return detail_algo::search_n_top_dispatch(first, last, count, value, is_seg_t(), cat_t());
468
+ }
469
+ }
470
+
471
+ } // namespace container
472
+ } // namespace boost
473
+
474
+ #include <boost/container/detail/config_end.hpp>
475
+
476
+ #endif // BOOST_CONTAINER_EXPERIMENTAL_SEGMENTED_SEARCH_N_HPP