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.
- checksums.yaml +4 -4
- data/CHANGELOG +37 -15
- data/build/cxx_tests.rb +2 -0
- data/build/support/cxx_dependency_map.rb +3 -63
- data/src/agent/Core/Config.h +1 -1
- data/src/agent/Core/Controller/Config.h +1 -1
- data/src/agent/Shared/ApiServerUtils.h +1 -1
- data/src/agent/Watchdog/Config.h +1 -1
- data/src/apache2_module/Hooks.cpp +13 -0
- data/src/apache2_module/Utils.h +14 -0
- data/src/cxx_supportlib/Constants.h +1 -1
- data/src/cxx_supportlib/FileTools/FileManip.cpp +27 -3
- data/src/cxx_supportlib/InstanceDirectory.h +30 -3
- data/src/cxx_supportlib/ServerKit/Errors.h +1 -1
- data/src/cxx_supportlib/ServerKit/HttpHeaderParser.h +1 -1
- data/src/cxx_supportlib/ServerKit/HttpHeaderParserState.h +1 -1
- data/src/cxx_supportlib/ServerKit/HttpRequest.h +1 -1
- data/src/cxx_supportlib/ServerKit/llerrors.h +3 -3
- data/src/cxx_supportlib/ServerKit/llversion.h +1 -1
- data/src/cxx_supportlib/{ServerKit/llhttp_api.c → vendor-copy/llhttp/api.c} +30 -23
- data/src/cxx_supportlib/{ServerKit → vendor-copy/llhttp}/llhttp.c +1756 -1645
- data/src/cxx_supportlib/{ServerKit → vendor-copy/llhttp}/llhttp.h +35 -13
- data/src/cxx_supportlib/vendor-modified/boost/algorithm/string/classification.hpp +19 -0
- data/src/cxx_supportlib/vendor-modified/boost/algorithm/string/formatter.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/algorithm/string/trim_all.hpp +0 -2
- data/src/cxx_supportlib/vendor-modified/boost/assert.hpp +20 -13
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_gcc_x86.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/atomic/thread_pause.hpp +4 -0
- data/src/cxx_supportlib/vendor-modified/boost/bind/mem_fn.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/circular_buffer/debug.hpp +4 -0
- data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx03.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx11.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx14.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx17.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx20.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx23.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/config/auto_link.hpp +6 -1
- data/src/cxx_supportlib/vendor-modified/boost/config/compiler/clang_version.hpp +10 -1
- data/src/cxx_supportlib/vendor-modified/boost/config/compiler/visualc.hpp +5 -3
- data/src/cxx_supportlib/vendor-modified/boost/config/detail/cxx_composite.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/config/workaround.hpp +5 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/adaptive_pool.hpp +57 -53
- data/src/cxx_supportlib/vendor-modified/boost/container/allocator.hpp +10 -10
- data/src/cxx_supportlib/vendor-modified/boost/container/allocator_traits.hpp +34 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/container_fwd.hpp +14 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/deque.hpp +176 -2287
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool.hpp +13 -9
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool_impl.hpp +186 -70
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/algorithm.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/aligned_allocation.hpp +149 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/alloc_helpers.hpp +35 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/alloc_lib.h +1 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/bit_utilities.hpp +133 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/compare_functors.hpp +18 -3
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/config_begin.hpp +5 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/config_end.hpp +4 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/container_rebind.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/copy_move_algo.hpp +20 -10
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/deque_impl.hpp +2744 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/dispatch_uses_allocator.hpp +202 -104
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/dlmalloc.hpp +5 -4
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/flat_tree.hpp +161 -85
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_constructible.hpp +180 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/iterators.hpp +3 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/math_functions.hpp +12 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/mpl.hpp +16 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/mutex.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/next_capacity.hpp +9 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_pool.hpp +18 -14
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_pool_impl.hpp +256 -41
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/operator_new_helpers.hpp +75 -24
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/pair.hpp +1 -56
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/placement_new.hpp +16 -3
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_common_alloc.hpp +1 -7
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/range_utils.hpp +196 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/std_fwd.hpp +33 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/tree.hpp +124 -69
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/workaround.hpp +109 -7
- data/src/cxx_supportlib/vendor-modified/boost/container/devector.hpp +168 -162
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/nest.hpp +2978 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/pmr/nest.hpp +45 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_all_of.hpp +43 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_any_of.hpp +42 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_copy.hpp +229 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_copy_if.hpp +270 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_copy_n.hpp +308 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_count.hpp +101 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_count_if.hpp +100 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_equal.hpp +268 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_fill.hpp +101 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_fill_n.hpp +171 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_find.hpp +110 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_find_if.hpp +110 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_find_if_not.hpp +43 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_find_last.hpp +179 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_find_last_if.hpp +179 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_find_last_if_not.hpp +43 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_for_each.hpp +92 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_generate.hpp +90 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_generate_n.hpp +162 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_is_partitioned.hpp +46 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_is_sorted.hpp +49 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_is_sorted_until.hpp +169 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_iterator_traits.hpp +382 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_merge.hpp +428 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_mismatch.hpp +350 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_none_of.hpp +98 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_partition.hpp +296 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_partition_copy.hpp +105 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_partition_point.hpp +116 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_remove.hpp +57 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_remove_copy.hpp +207 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_remove_copy_if.hpp +223 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_remove_if.hpp +57 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_replace.hpp +90 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_replace_if.hpp +90 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_reverse.hpp +245 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_reverse_copy.hpp +229 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_search.hpp +211 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_search_n.hpp +476 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_set_difference.hpp +300 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_set_intersection.hpp +287 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_set_symmetric_difference.hpp +306 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_set_union.hpp +294 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_stable_partition.hpp +153 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_swap_ranges.hpp +92 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_transform.hpp +93 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/experimental/wrapped_iterator.hpp +142 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/flat_map.hpp +642 -417
- data/src/cxx_supportlib/vendor-modified/boost/container/flat_set.hpp +141 -30
- data/src/cxx_supportlib/vendor-modified/boost/container/hub.hpp +2426 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/list.hpp +65 -57
- data/src/cxx_supportlib/vendor-modified/boost/container/map.hpp +247 -68
- data/src/cxx_supportlib/vendor-modified/boost/container/new_allocator.hpp +7 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/node_allocator.hpp +39 -33
- data/src/cxx_supportlib/vendor-modified/boost/container/options.hpp +156 -23
- data/src/cxx_supportlib/vendor-modified/boost/container/pmr/global_resource.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/container/pmr/hub.hpp +43 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/pmr/memory_resource.hpp +5 -3
- data/src/cxx_supportlib/vendor-modified/boost/container/pmr/monotonic_buffer_resource.hpp +1 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/pmr/polymorphic_allocator.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/pmr/resource_adaptor.hpp +4 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/pmr/segtor.hpp +45 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/scoped_allocator.hpp +5 -4
- data/src/cxx_supportlib/vendor-modified/boost/container/segtor.hpp +905 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/set.hpp +148 -35
- data/src/cxx_supportlib/vendor-modified/boost/container/slist.hpp +59 -52
- data/src/cxx_supportlib/vendor-modified/boost/container/small_vector.hpp +632 -5
- data/src/cxx_supportlib/vendor-modified/boost/container/stable_vector.hpp +66 -60
- data/src/cxx_supportlib/vendor-modified/boost/container/static_vector.hpp +46 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/string.hpp +612 -317
- data/src/cxx_supportlib/vendor-modified/boost/container/uses_allocator.hpp +54 -111
- data/src/cxx_supportlib/vendor-modified/boost/container/uses_allocator_construction.hpp +100 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/uses_allocator_fwd.hpp +1 -3
- data/src/cxx_supportlib/vendor-modified/boost/container/vector.hpp +233 -116
- data/src/cxx_supportlib/vendor-modified/boost/container_hash/hash.hpp +5 -1
- data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test.hpp +17 -10
- data/src/cxx_supportlib/vendor-modified/boost/date_time/period.hpp +1 -3
- data/src/cxx_supportlib/vendor-modified/boost/describe/detail/config.hpp +16 -0
- data/src/cxx_supportlib/vendor-modified/boost/exception/detail/encoder.hpp +114 -0
- data/src/cxx_supportlib/vendor-modified/boost/exception/detail/error_info_impl.hpp +4 -0
- data/src/cxx_supportlib/vendor-modified/boost/exception/detail/requires_cxx11.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/exception/detail/type_info.hpp +211 -1
- data/src/cxx_supportlib/vendor-modified/boost/exception/diagnostic_information.hpp +59 -0
- data/src/cxx_supportlib/vendor-modified/boost/exception/exception.hpp +6 -0
- data/src/cxx_supportlib/vendor-modified/boost/exception/info.hpp +34 -0
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/avltree.hpp +0 -1
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/bstree.hpp +12 -3
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/derivation_value_traits.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/ebo_functor_holder.hpp +29 -174
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/generic_hook.hpp +18 -2
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/key_nodeptr_comp.hpp +0 -1
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/workaround.hpp +4 -5
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/hashtable.hpp +20 -11
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/list.hpp +42 -14
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/slist.hpp +58 -22
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/unordered_set.hpp +3 -1
- data/src/cxx_supportlib/vendor-modified/boost/iterator/advance.hpp +5 -1
- data/src/cxx_supportlib/vendor-modified/boost/iterator/distance.hpp +8 -2
- data/src/cxx_supportlib/vendor-modified/boost/iterator/is_iterator.hpp +9 -0
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/bad_lexical_cast.hpp +11 -1
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/buffer_view.hpp +9 -1
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/config.hpp +22 -0
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical.hpp +15 -7
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical_streams.hpp +23 -11
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_numeric.hpp +11 -1
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/inf_nan.hpp +9 -1
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/is_character.hpp +11 -2
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_basic_unlockedbuf.hpp +10 -1
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_char_constants.hpp +8 -1
- data/src/cxx_supportlib/vendor-modified/boost/{detail → lexical_cast/detail}/lcast_precision.hpp +13 -1
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_unsigned_converters.hpp +11 -1
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/widest_char.hpp +10 -2
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/try_lexical_convert.hpp +15 -2
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast.hpp +11 -1
- data/src/cxx_supportlib/vendor-modified/boost/libs/thread/src/pthread/once_atomic.cpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/libs/thread/src/pthread/thread.cpp +48 -46
- data/src/cxx_supportlib/vendor-modified/boost/move/detail/meta_utils.hpp +23 -0
- data/src/cxx_supportlib/vendor-modified/boost/move/detail/move_helpers.hpp +24 -24
- data/src/cxx_supportlib/vendor-modified/boost/move/detail/nsec_clock.hpp +12 -4
- data/src/cxx_supportlib/vendor-modified/boost/move/detail/type_traits.hpp +76 -0
- data/src/cxx_supportlib/vendor-modified/boost/move/detail/workaround.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/move/traits.hpp +11 -0
- data/src/cxx_supportlib/vendor-modified/boost/mp11/algorithm.hpp +58 -37
- data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_copy_if.hpp +1 -2
- data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_map_find.hpp +17 -9
- data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_remove_if.hpp +1 -2
- data/src/cxx_supportlib/vendor-modified/boost/mp11/integer_sequence.hpp +6 -0
- data/src/cxx_supportlib/vendor-modified/boost/mp11/version.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/none_t.hpp +6 -1
- data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_common_defs.hpp +188 -0
- data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_factory_support.hpp +0 -6
- data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_hash.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_nonmember_interface.hpp +117 -0
- data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_reference_spec.hpp +108 -83
- data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_relops.hpp +39 -39
- data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_select_implementation.hpp +37 -0
- data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_swap.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_trivially_copyable_base.hpp +8 -8
- data/src/cxx_supportlib/vendor-modified/boost/optional/detail/union_optional.hpp +724 -0
- data/src/cxx_supportlib/vendor-modified/boost/optional/optional.hpp +93 -220
- data/src/cxx_supportlib/vendor-modified/boost/optional/optional_fwd.hpp +14 -4
- data/src/cxx_supportlib/vendor-modified/boost/optional/optional_io.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/random/binomial_distribution.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/random/uniform_int_distribution.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/rational.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/static_assert.hpp +4 -6
- data/src/cxx_supportlib/vendor-modified/boost/system/api_config.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/system/detail/config.hpp +16 -0
- data/src/cxx_supportlib/vendor-modified/boost/system/detail/error_category.hpp +13 -13
- data/src/cxx_supportlib/vendor-modified/boost/system/detail/error_category_impl.hpp +5 -5
- data/src/cxx_supportlib/vendor-modified/boost/thread/concurrent_queues/detail/sync_deque_base.hpp +3 -2
- data/src/cxx_supportlib/vendor-modified/boost/thread/concurrent_queues/detail/sync_queue_base.hpp +3 -2
- data/src/cxx_supportlib/vendor-modified/boost/thread/detail/thread.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/thread/experimental/parallel/v2/task_region.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/thread/future.hpp +30 -28
- data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/once.hpp +6 -3
- data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/once_atomic.hpp +5 -1
- data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/pthread_helpers.hpp +1 -0
- data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/shared_mutex.hpp +16 -16
- data/src/cxx_supportlib/vendor-modified/boost/thread/v2/shared_mutex.hpp +26 -26
- data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map.hpp +196 -6
- data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_set.hpp +191 -6
- data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_node_map.hpp +196 -5
- data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_node_set.hpp +192 -5
- data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/concurrent_table.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/core.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/table.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/implementation.hpp +52 -16
- data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/ranges_support.hpp +104 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/type_traits.hpp +1 -14
- data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/unordered_printers.hpp +10 -4
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map.hpp +121 -3
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set.hpp +118 -3
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_map.hpp +338 -1
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map.hpp +121 -3
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set.hpp +118 -3
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_set.hpp +333 -1
- data/src/cxx_supportlib/vendor-modified/boost/version.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/jsoncpp/json-forwards.h +276 -143
- data/src/cxx_supportlib/vendor-modified/jsoncpp/json.h +1262 -771
- data/src/cxx_supportlib/vendor-modified/jsoncpp/jsoncpp.cpp +1704 -1586
- data/src/nginx_module/ContentHandler.c +35 -0
- data/src/ruby_supportlib/phusion_passenger/common_library.rb +6 -6
- data/src/ruby_supportlib/phusion_passenger/utils/json.rb +25 -2
- data/src/ruby_supportlib/phusion_passenger/vendor/daemon_controller.rb +12 -1
- data/src/ruby_supportlib/phusion_passenger.rb +1 -1
- metadata +73 -8
- data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_utility.hpp +0 -41
- /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
|