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,306 @@
|
|
|
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_SET_SYMMETRIC_DIFFERENCE_HPP
|
|
11
|
+
#define BOOST_CONTAINER_EXPERIMENTAL_SEGMENTED_SET_SYMMETRIC_DIFFERENCE_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_copy.hpp>
|
|
25
|
+
#include <boost/container/detail/iterator.hpp>
|
|
26
|
+
|
|
27
|
+
namespace boost {
|
|
28
|
+
namespace container {
|
|
29
|
+
|
|
30
|
+
template <class InIter1, class Sent1, class InIter2, class Sent2, class OutIter, class Comp>
|
|
31
|
+
OutIter segmented_set_symmetric_difference
|
|
32
|
+
(InIter1 first1, Sent1 last1, InIter2 first2, Sent2 last2, OutIter result, Comp comp);
|
|
33
|
+
|
|
34
|
+
template <class InIter1, class Sent1, class InIter2, class Sent2, class OutIter>
|
|
35
|
+
OutIter segmented_set_symmetric_difference
|
|
36
|
+
(InIter1 first1, Sent1 last1, InIter2 first2, Sent2 last2, OutIter result);
|
|
37
|
+
|
|
38
|
+
namespace detail_algo {
|
|
39
|
+
|
|
40
|
+
//////////////////////////////////////////////////////////////////////////////
|
|
41
|
+
// set_symmetric_difference_dst_bounded: leaf kernel that computes the
|
|
42
|
+
// symmetric difference of [first1, last1) and [first2, last2) into
|
|
43
|
+
// [dst_first, dst_last), stopping when source 1, source 2, or destination
|
|
44
|
+
// is exhausted. When dst_last is unreachable_sentinel_t the
|
|
45
|
+
// destination-full check is optimised away.
|
|
46
|
+
// No residue draining is performed; the caller handles that.
|
|
47
|
+
//////////////////////////////////////////////////////////////////////////////
|
|
48
|
+
|
|
49
|
+
template <class Iter1, class Sent1, class Iter2, class Sent2, class DstIter, class DstSent,
|
|
50
|
+
class Comp, class DstTag, class SrcCat>
|
|
51
|
+
BOOST_CONTAINER_FORCEINLINE
|
|
52
|
+
typename algo_enable_if_c<!DstTag::value, segtrio<Iter1, Iter2, DstIter> >::type
|
|
53
|
+
set_symmetric_difference_dst_bounded
|
|
54
|
+
(Iter1 first1, Sent1 last1, Iter2 first2, Sent2 last2,
|
|
55
|
+
DstIter dst_first, DstSent dst_last, Comp comp, DstTag, SrcCat)
|
|
56
|
+
{
|
|
57
|
+
while(first1 != last1 && first2 != last2 && dst_first != dst_last) {
|
|
58
|
+
if (comp(*first1, *first2)) {
|
|
59
|
+
*dst_first = *first1;
|
|
60
|
+
++first1;
|
|
61
|
+
++dst_first;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
if (comp(*first2, *first1)) {
|
|
65
|
+
*dst_first = *first2;
|
|
66
|
+
++dst_first;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
++first1;
|
|
70
|
+
}
|
|
71
|
+
++first2;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return segtrio<Iter1, Iter2, DstIter>(first1, first2, dst_first);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
//////////////////////////////////////////////////////////////////////////////
|
|
78
|
+
// set_symmetric_difference_until_exhausts: writes the symmetric difference
|
|
79
|
+
// into result until src1 or src2 is exhausted. No residue draining.
|
|
80
|
+
//
|
|
81
|
+
// Non-segmented destination: single bounded call with unreachable_sentinel.
|
|
82
|
+
// Segmented destination: walk dst segments, calling dst_bounded per segment.
|
|
83
|
+
//////////////////////////////////////////////////////////////////////////////
|
|
84
|
+
|
|
85
|
+
template <class Iter1, class Sent1, class Iter2, class Sent2, class DstIter,
|
|
86
|
+
class Comp, class Cat, class Tag>
|
|
87
|
+
BOOST_CONTAINER_FORCEINLINE
|
|
88
|
+
segtrio<Iter1, Iter2, DstIter> set_symmetric_difference_until_exhausts
|
|
89
|
+
(Iter1 first1, Sent1 last1, Iter2 first2, Sent2 last2, DstIter result, Comp comp,
|
|
90
|
+
const Tag &, const Cat &src1_cat)
|
|
91
|
+
{
|
|
92
|
+
return (set_symmetric_difference_dst_bounded)
|
|
93
|
+
(first1, last1, first2, last2, result, unreachable_sentinel_t(),
|
|
94
|
+
comp, non_segmented_iterator_tag(), src1_cat);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
template <class Iter1, class Sent1, class Iter2, class Sent2, class SegDstIter,
|
|
98
|
+
class Comp, class Cat>
|
|
99
|
+
segtrio<Iter1, Iter2, SegDstIter> set_symmetric_difference_until_exhausts
|
|
100
|
+
(Iter1 first1, Sent1 last1, Iter2 first2, Sent2 last2, SegDstIter result, Comp comp,
|
|
101
|
+
const segmented_iterator_tag &, const Cat &src1_cat)
|
|
102
|
+
{
|
|
103
|
+
typedef segmented_iterator_traits<SegDstIter> dst_traits;
|
|
104
|
+
typedef typename dst_traits::local_iterator dst_local_iterator;
|
|
105
|
+
typedef typename dst_traits::segment_iterator dst_segment_iterator;
|
|
106
|
+
typedef typename segmented_iterator_traits<dst_local_iterator>::is_segmented_iterator dst_is_local_seg_t;
|
|
107
|
+
typedef segtrio<Iter1, Iter2, dst_local_iterator> bounded_t;
|
|
108
|
+
typedef segtrio<Iter1, Iter2, SegDstIter> result_t;
|
|
109
|
+
|
|
110
|
+
if(first1 == last1 || first2 == last2)
|
|
111
|
+
return result_t(first1, first2, result);
|
|
112
|
+
|
|
113
|
+
dst_segment_iterator dst_seg = dst_traits::segment(result);
|
|
114
|
+
dst_local_iterator dst_local = dst_traits::local(result);
|
|
115
|
+
|
|
116
|
+
while(1) {
|
|
117
|
+
const dst_local_iterator dst_end = dst_traits::end(dst_seg);
|
|
118
|
+
const bounded_t r = (set_symmetric_difference_dst_bounded)
|
|
119
|
+
(first1, last1, first2, last2, dst_local, dst_end, comp,
|
|
120
|
+
dst_is_local_seg_t(), src1_cat);
|
|
121
|
+
first1 = r.first;
|
|
122
|
+
first2 = r.second;
|
|
123
|
+
dst_local = r.third;
|
|
124
|
+
|
|
125
|
+
if(dst_local != dst_end) {
|
|
126
|
+
return result_t(first1, first2, dst_traits::compose(dst_seg, dst_local));
|
|
127
|
+
}
|
|
128
|
+
++dst_seg;
|
|
129
|
+
dst_local = dst_traits::begin(dst_seg);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
//////////////////////////////////////////////////////////////////////////////
|
|
134
|
+
// set_symmetric_difference_seg2_dispatch: exploits segmentation of range 2.
|
|
135
|
+
//
|
|
136
|
+
// Non-segmented src2: dispatches on output segmentation (guarded).
|
|
137
|
+
// Segmented src2: walks src2 segments, recurses on local src2.
|
|
138
|
+
//////////////////////////////////////////////////////////////////////////////
|
|
139
|
+
|
|
140
|
+
template <class Iter1, class Sent1, class Iter2, class Sent2, class OutIter, class Comp, class Cat>
|
|
141
|
+
BOOST_CONTAINER_FORCEINLINE segtrio<Iter1, Iter2, OutIter> set_symmetric_difference_seg2_dispatch
|
|
142
|
+
(Iter1 first1, Sent1 last1, Iter2 first2, Sent2 last2, OutIter result, Comp comp,
|
|
143
|
+
non_segmented_iterator_tag, const Cat& src1_cat)
|
|
144
|
+
{
|
|
145
|
+
#if !defined(BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO)
|
|
146
|
+
typedef segmented_iterator_traits<OutIter> out_traits;
|
|
147
|
+
typedef typename out_traits::is_segmented_iterator is_out_seg_t;
|
|
148
|
+
return (set_symmetric_difference_until_exhausts)
|
|
149
|
+
(first1, last1, first2, last2, result, comp, is_out_seg_t(), src1_cat);
|
|
150
|
+
#else
|
|
151
|
+
return (set_symmetric_difference_dst_bounded)
|
|
152
|
+
(first1, last1, first2, last2, result, unreachable_sentinel_t(),
|
|
153
|
+
comp, non_segmented_iterator_tag(), src1_cat);
|
|
154
|
+
#endif
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
template <class Iter1, class Sent1, class SegIter2, class OutIter, class Comp, class Cat>
|
|
158
|
+
segtrio<Iter1, SegIter2, OutIter> set_symmetric_difference_seg2_dispatch
|
|
159
|
+
(Iter1 first1, Sent1 last1, SegIter2 first2, SegIter2 last2, OutIter result, Comp comp,
|
|
160
|
+
segmented_iterator_tag, const Cat & cat)
|
|
161
|
+
{
|
|
162
|
+
typedef segmented_iterator_traits<SegIter2> src2_traits;
|
|
163
|
+
typedef typename src2_traits::local_iterator src2_local_iterator;
|
|
164
|
+
typedef typename src2_traits::segment_iterator src2_segment_iterator;
|
|
165
|
+
typedef typename segmented_iterator_traits
|
|
166
|
+
<src2_local_iterator>::is_segmented_iterator src2_is_local_seg_t;
|
|
167
|
+
typedef segtrio<Iter1, src2_local_iterator, OutIter> local_result_t;
|
|
168
|
+
typedef segtrio<Iter1, SegIter2, OutIter> result_t;
|
|
169
|
+
|
|
170
|
+
if(first1 == last1 || first2 == last2)
|
|
171
|
+
return result_t(first1, first2, result);
|
|
172
|
+
|
|
173
|
+
src2_segment_iterator sf2 = src2_traits::segment(first2);
|
|
174
|
+
const src2_segment_iterator sl2 = src2_traits::segment(last2);
|
|
175
|
+
src2_local_iterator lf2 = src2_traits::local(first2);
|
|
176
|
+
|
|
177
|
+
if(sf2 == sl2) {
|
|
178
|
+
local_result_t r = (set_symmetric_difference_seg2_dispatch)
|
|
179
|
+
(first1, last1, lf2, src2_traits::local(last2), result, comp,
|
|
180
|
+
src2_is_local_seg_t(), cat);
|
|
181
|
+
return result_t(r.first, src2_traits::compose(sf2, r.second), r.third);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
local_result_t r = (set_symmetric_difference_seg2_dispatch)
|
|
185
|
+
(first1, last1, lf2, src2_traits::end(sf2), result, comp,
|
|
186
|
+
src2_is_local_seg_t(), cat);
|
|
187
|
+
if (r.first == last1)
|
|
188
|
+
goto exit;
|
|
189
|
+
|
|
190
|
+
for(++sf2; sf2 != sl2; ++sf2) {
|
|
191
|
+
r = (set_symmetric_difference_seg2_dispatch)
|
|
192
|
+
(r.first, last1, src2_traits::begin(sf2), src2_traits::end(sf2),
|
|
193
|
+
r.third, comp, src2_is_local_seg_t(), cat);
|
|
194
|
+
if(r.first == last1)
|
|
195
|
+
goto exit;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
r = (set_symmetric_difference_seg2_dispatch)
|
|
199
|
+
(r.first, last1, src2_traits::begin(sf2), src2_traits::local(last2),
|
|
200
|
+
r.third, comp, src2_is_local_seg_t(), cat);
|
|
201
|
+
exit:
|
|
202
|
+
return result_t(r.first, src2_traits::compose(sf2, r.second), r.third);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
//////////////////////////////////////////////////////////////////////////////
|
|
207
|
+
// set_symmetric_difference_scan: exploits segmentation of range 1.
|
|
208
|
+
//
|
|
209
|
+
// Non-segmented src1: dispatches on src2 segmentation (guarded).
|
|
210
|
+
// Segmented src1: walks src1 segments, recurses on local src1.
|
|
211
|
+
//////////////////////////////////////////////////////////////////////////////
|
|
212
|
+
|
|
213
|
+
template <class FwdIt, class Sent, class InIter2, class Sent2, class OutIter, class Comp>
|
|
214
|
+
BOOST_CONTAINER_FORCEINLINE segtrio<FwdIt, InIter2, OutIter> set_symmetric_difference_scan
|
|
215
|
+
(FwdIt first1, Sent last1, InIter2 first2, Sent2 last2, OutIter result, Comp comp,
|
|
216
|
+
non_segmented_iterator_tag)
|
|
217
|
+
{
|
|
218
|
+
typedef sent_filter<FwdIt, Sent> sf1;
|
|
219
|
+
#if !defined(BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO)
|
|
220
|
+
typedef sent_filter<InIter2, Sent2> sf2;
|
|
221
|
+
|
|
222
|
+
return (set_symmetric_difference_seg2_dispatch)
|
|
223
|
+
(first1, last1, first2, last2, result, comp,
|
|
224
|
+
typename sf2::seg_t(),
|
|
225
|
+
typename sf1::cat_t());
|
|
226
|
+
#else
|
|
227
|
+
return (set_symmetric_difference_until_exhausts)
|
|
228
|
+
(first1, last1, first2, last2, result, comp,
|
|
229
|
+
non_segmented_iterator_tag(), typename sf1::cat_t());
|
|
230
|
+
#endif
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
template <class SegIt, class InIter2, class Sent2, class OutIter, class Comp>
|
|
234
|
+
segtrio<SegIt, InIter2, OutIter> set_symmetric_difference_scan
|
|
235
|
+
(SegIt first, SegIt last, InIter2 first2, Sent2 last2, OutIter result, Comp comp,
|
|
236
|
+
segmented_iterator_tag)
|
|
237
|
+
{
|
|
238
|
+
typedef segmented_iterator_traits<SegIt> traits;
|
|
239
|
+
typedef typename traits::local_iterator local_iterator;
|
|
240
|
+
typedef typename traits::segment_iterator segment_iterator;
|
|
241
|
+
typedef typename segmented_iterator_traits
|
|
242
|
+
<local_iterator>::is_segmented_iterator is_local_seg_t;
|
|
243
|
+
typedef segtrio<local_iterator, InIter2, OutIter> local_result_t;
|
|
244
|
+
typedef segtrio<SegIt, InIter2, OutIter> result_t;
|
|
245
|
+
|
|
246
|
+
if(first == last || first2 == last2)
|
|
247
|
+
return result_t(first, first2, result);
|
|
248
|
+
|
|
249
|
+
segment_iterator scur = traits::segment(first);
|
|
250
|
+
segment_iterator const slast = traits::segment(last);
|
|
251
|
+
local_iterator lcur = traits::local(first);
|
|
252
|
+
|
|
253
|
+
if(scur == slast) {
|
|
254
|
+
local_result_t r = set_symmetric_difference_scan
|
|
255
|
+
(lcur, traits::local(last), first2, last2, result, comp, is_local_seg_t());
|
|
256
|
+
return result_t(traits::compose(scur, r.first), r.second, r.third);
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
local_result_t r = set_symmetric_difference_scan
|
|
260
|
+
(lcur, traits::end(scur), first2, last2, result, comp, is_local_seg_t());
|
|
261
|
+
if(r.second == last2)
|
|
262
|
+
return result_t(traits::compose(scur, r.first), r.second, r.third);
|
|
263
|
+
|
|
264
|
+
for(++scur; scur != slast; ++scur) {
|
|
265
|
+
r = set_symmetric_difference_scan
|
|
266
|
+
(traits::begin(scur), traits::end(scur), r.second, last2, r.third, comp, is_local_seg_t());
|
|
267
|
+
if(r.second == last2)
|
|
268
|
+
return result_t(traits::compose(scur, r.first), r.second, r.third);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
r = set_symmetric_difference_scan
|
|
272
|
+
(traits::begin(scur), traits::local(last), r.second, last2, r.third, comp, is_local_seg_t());
|
|
273
|
+
return result_t(traits::compose(scur, r.first), r.second, r.third);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
} // namespace detail_algo
|
|
278
|
+
|
|
279
|
+
template <class InIter1, class Sent1, class InIter2, class Sent2, class OutIter, class Comp>
|
|
280
|
+
inline OutIter segmented_set_symmetric_difference
|
|
281
|
+
(InIter1 first1, Sent1 last1, InIter2 first2, Sent2 last2, OutIter result, Comp comp)
|
|
282
|
+
{
|
|
283
|
+
typedef detail_algo::sent_filter<InIter1, Sent1> sf;
|
|
284
|
+
segtrio<InIter1, InIter2, OutIter> r = detail_algo::set_symmetric_difference_scan
|
|
285
|
+
(first1, last1, first2, last2, result, comp, typename sf::seg_t());
|
|
286
|
+
// Drain both source residues; at most one of these is non-empty.
|
|
287
|
+
result = r.third;
|
|
288
|
+
if(r.first != last1)
|
|
289
|
+
result = (segmented_copy)(r.first, last1, result);
|
|
290
|
+
return (r.second == last2) ? result : (segmented_copy)(r.second, last2, result);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
template <class InIter1, class Sent1, class InIter2, class Sent2, class OutIter>
|
|
294
|
+
inline OutIter segmented_set_symmetric_difference
|
|
295
|
+
(InIter1 first1, Sent1 last1, InIter2 first2, Sent2 last2, OutIter result)
|
|
296
|
+
{
|
|
297
|
+
return boost::container::segmented_set_symmetric_difference
|
|
298
|
+
(first1, last1, first2, last2, result, detail_algo::segmented_default_less());
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
} // namespace container
|
|
302
|
+
} // namespace boost
|
|
303
|
+
|
|
304
|
+
#include <boost/container/detail/config_end.hpp>
|
|
305
|
+
|
|
306
|
+
#endif // BOOST_CONTAINER_EXPERIMENTAL_SEGMENTED_SET_SYMMETRIC_DIFFERENCE_HPP
|
|
@@ -0,0 +1,294 @@
|
|
|
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_SET_UNION_HPP
|
|
11
|
+
#define BOOST_CONTAINER_EXPERIMENTAL_SEGMENTED_SET_UNION_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_copy.hpp>
|
|
25
|
+
#include <boost/container/detail/iterator.hpp>
|
|
26
|
+
|
|
27
|
+
namespace boost {
|
|
28
|
+
namespace container {
|
|
29
|
+
|
|
30
|
+
template <class InIter1, class Sent1, class InIter2, class Sent2, class OutIter, class Comp>
|
|
31
|
+
OutIter segmented_set_union
|
|
32
|
+
(InIter1 first1, Sent1 last1, InIter2 first2, Sent2 last2, OutIter result, Comp comp);
|
|
33
|
+
|
|
34
|
+
template <class InIter1, class Sent1, class InIter2, class Sent2, class OutIter>
|
|
35
|
+
OutIter segmented_set_union
|
|
36
|
+
(InIter1 first1, Sent1 last1, InIter2 first2, Sent2 last2, OutIter result);
|
|
37
|
+
|
|
38
|
+
namespace detail_algo {
|
|
39
|
+
|
|
40
|
+
//////////////////////////////////////////////////////////////////////////////
|
|
41
|
+
// set_union_dst_bounded: leaf kernel that unions [first1, last1) and
|
|
42
|
+
// [first2, last2) into [dst_first, dst_last), stopping when source 1,
|
|
43
|
+
// source 2, or destination is exhausted. When dst_last is
|
|
44
|
+
// unreachable_sentinel_t the destination-full check is optimised away.
|
|
45
|
+
// No residue draining is performed; the caller handles that.
|
|
46
|
+
//////////////////////////////////////////////////////////////////////////////
|
|
47
|
+
|
|
48
|
+
template <class Iter1, class Sent1, class Iter2, class Sent2, class DstIter, class DstSent,
|
|
49
|
+
class Comp, class DstTag, class SrcCat>
|
|
50
|
+
BOOST_CONTAINER_FORCEINLINE
|
|
51
|
+
typename algo_enable_if_c<!DstTag::value, segtrio<Iter1, Iter2, DstIter> >::type
|
|
52
|
+
set_union_dst_bounded
|
|
53
|
+
(Iter1 first1, Sent1 last1, Iter2 first2, Sent2 last2,
|
|
54
|
+
DstIter dst_first, DstSent dst_last, Comp comp, DstTag, SrcCat)
|
|
55
|
+
{
|
|
56
|
+
while(first1 != last1 && first2 != last2 && dst_first != dst_last) {
|
|
57
|
+
if (comp(*first1, *first2)) { *dst_first = *first1; ++first1; }
|
|
58
|
+
else if (comp(*first2, *first1)) { *dst_first = *first2; ++first2; }
|
|
59
|
+
else { *dst_first = *first1; ++first1; ++first2; }
|
|
60
|
+
++dst_first;
|
|
61
|
+
}
|
|
62
|
+
return segtrio<Iter1, Iter2, DstIter>(first1, first2, dst_first);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
//////////////////////////////////////////////////////////////////////////////
|
|
66
|
+
// set_union_until_exhausts: writes the union into result until src1 or src2
|
|
67
|
+
// is exhausted. No residue draining.
|
|
68
|
+
//
|
|
69
|
+
// Non-segmented destination: single bounded call with unreachable_sentinel.
|
|
70
|
+
// Segmented destination: walk dst segments, calling dst_bounded per segment.
|
|
71
|
+
//////////////////////////////////////////////////////////////////////////////
|
|
72
|
+
|
|
73
|
+
template <class Iter1, class Sent1, class Iter2, class Sent2, class DstIter,
|
|
74
|
+
class Comp, class Cat, class Tag>
|
|
75
|
+
BOOST_CONTAINER_FORCEINLINE
|
|
76
|
+
segtrio<Iter1, Iter2, DstIter> set_union_until_exhausts
|
|
77
|
+
(Iter1 first1, Sent1 last1, Iter2 first2, Sent2 last2, DstIter result, Comp comp,
|
|
78
|
+
const Tag &, const Cat &src1_cat)
|
|
79
|
+
{
|
|
80
|
+
return (set_union_dst_bounded)
|
|
81
|
+
(first1, last1, first2, last2, result, unreachable_sentinel_t(),
|
|
82
|
+
comp, non_segmented_iterator_tag(), src1_cat);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
template <class Iter1, class Sent1, class Iter2, class Sent2, class SegDstIter,
|
|
86
|
+
class Comp, class Cat>
|
|
87
|
+
segtrio<Iter1, Iter2, SegDstIter> set_union_until_exhausts
|
|
88
|
+
(Iter1 first1, Sent1 last1, Iter2 first2, Sent2 last2, SegDstIter result, Comp comp,
|
|
89
|
+
const segmented_iterator_tag &, const Cat &src1_cat)
|
|
90
|
+
{
|
|
91
|
+
typedef segmented_iterator_traits<SegDstIter> dst_traits;
|
|
92
|
+
typedef typename dst_traits::local_iterator dst_local_iterator;
|
|
93
|
+
typedef typename dst_traits::segment_iterator dst_segment_iterator;
|
|
94
|
+
typedef typename segmented_iterator_traits<dst_local_iterator>::is_segmented_iterator dst_is_local_seg_t;
|
|
95
|
+
typedef segtrio<Iter1, Iter2, dst_local_iterator> bounded_t;
|
|
96
|
+
typedef segtrio<Iter1, Iter2, SegDstIter> result_t;
|
|
97
|
+
|
|
98
|
+
if(first1 == last1 || first2 == last2)
|
|
99
|
+
return result_t(first1, first2, result);
|
|
100
|
+
|
|
101
|
+
dst_segment_iterator dst_seg = dst_traits::segment(result);
|
|
102
|
+
dst_local_iterator dst_local = dst_traits::local(result);
|
|
103
|
+
|
|
104
|
+
while(1) {
|
|
105
|
+
const dst_local_iterator dst_end = dst_traits::end(dst_seg);
|
|
106
|
+
const bounded_t r = (set_union_dst_bounded)
|
|
107
|
+
(first1, last1, first2, last2, dst_local, dst_end, comp,
|
|
108
|
+
dst_is_local_seg_t(), src1_cat);
|
|
109
|
+
first1 = r.first;
|
|
110
|
+
first2 = r.second;
|
|
111
|
+
dst_local = r.third;
|
|
112
|
+
|
|
113
|
+
if(dst_local != dst_end) {
|
|
114
|
+
return result_t(first1, first2, dst_traits::compose(dst_seg, dst_local));
|
|
115
|
+
}
|
|
116
|
+
++dst_seg;
|
|
117
|
+
dst_local = dst_traits::begin(dst_seg);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
//////////////////////////////////////////////////////////////////////////////
|
|
122
|
+
// set_union_seg2_dispatch: exploits segmentation of range 2.
|
|
123
|
+
//
|
|
124
|
+
// Non-segmented src2: dispatches on output segmentation (guarded).
|
|
125
|
+
// Segmented src2: walks src2 segments, recurses on local src2.
|
|
126
|
+
//////////////////////////////////////////////////////////////////////////////
|
|
127
|
+
|
|
128
|
+
template <class Iter1, class Sent1, class Iter2, class Sent2, class OutIter, class Comp, class Cat>
|
|
129
|
+
BOOST_CONTAINER_FORCEINLINE segtrio<Iter1, Iter2, OutIter> set_union_seg2_dispatch
|
|
130
|
+
(Iter1 first1, Sent1 last1, Iter2 first2, Sent2 last2, OutIter result, Comp comp,
|
|
131
|
+
non_segmented_iterator_tag, const Cat& src1_cat)
|
|
132
|
+
{
|
|
133
|
+
#if !defined(BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO)
|
|
134
|
+
typedef segmented_iterator_traits<OutIter> out_traits;
|
|
135
|
+
typedef typename out_traits::is_segmented_iterator is_out_seg_t;
|
|
136
|
+
return (set_union_until_exhausts)
|
|
137
|
+
(first1, last1, first2, last2, result, comp, is_out_seg_t(), src1_cat);
|
|
138
|
+
#else
|
|
139
|
+
return (set_union_dst_bounded)
|
|
140
|
+
(first1, last1, first2, last2, result, unreachable_sentinel_t(),
|
|
141
|
+
comp, non_segmented_iterator_tag(), src1_cat);
|
|
142
|
+
#endif
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
template <class Iter1, class Sent1, class SegIter2, class OutIter, class Comp, class Cat>
|
|
146
|
+
segtrio<Iter1, SegIter2, OutIter> set_union_seg2_dispatch
|
|
147
|
+
(Iter1 first1, Sent1 last1, SegIter2 first2, SegIter2 last2, OutIter result, Comp comp,
|
|
148
|
+
segmented_iterator_tag, const Cat & cat)
|
|
149
|
+
{
|
|
150
|
+
typedef segmented_iterator_traits<SegIter2> src2_traits;
|
|
151
|
+
typedef typename src2_traits::local_iterator src2_local_iterator;
|
|
152
|
+
typedef typename src2_traits::segment_iterator src2_segment_iterator;
|
|
153
|
+
typedef typename segmented_iterator_traits
|
|
154
|
+
<src2_local_iterator>::is_segmented_iterator src2_is_local_seg_t;
|
|
155
|
+
typedef segtrio<Iter1, src2_local_iterator, OutIter> local_result_t;
|
|
156
|
+
typedef segtrio<Iter1, SegIter2, OutIter> result_t;
|
|
157
|
+
|
|
158
|
+
if(first1 == last1 || first2 == last2)
|
|
159
|
+
return result_t(first1, first2, result);
|
|
160
|
+
|
|
161
|
+
src2_segment_iterator sf2 = src2_traits::segment(first2);
|
|
162
|
+
const src2_segment_iterator sl2 = src2_traits::segment(last2);
|
|
163
|
+
src2_local_iterator lf2 = src2_traits::local(first2);
|
|
164
|
+
|
|
165
|
+
if(sf2 == sl2) {
|
|
166
|
+
local_result_t r = (set_union_seg2_dispatch)
|
|
167
|
+
(first1, last1, lf2, src2_traits::local(last2), result, comp,
|
|
168
|
+
src2_is_local_seg_t(), cat);
|
|
169
|
+
return result_t(r.first, src2_traits::compose(sf2, r.second), r.third);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
local_result_t r = (set_union_seg2_dispatch)
|
|
173
|
+
(first1, last1, lf2, src2_traits::end(sf2), result, comp,
|
|
174
|
+
src2_is_local_seg_t(), cat);
|
|
175
|
+
if (r.first == last1)
|
|
176
|
+
goto exit;
|
|
177
|
+
|
|
178
|
+
for(++sf2; sf2 != sl2; ++sf2) {
|
|
179
|
+
r = (set_union_seg2_dispatch)
|
|
180
|
+
(r.first, last1, src2_traits::begin(sf2), src2_traits::end(sf2),
|
|
181
|
+
r.third, comp, src2_is_local_seg_t(), cat);
|
|
182
|
+
if(r.first == last1)
|
|
183
|
+
goto exit;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
r = (set_union_seg2_dispatch)
|
|
187
|
+
(r.first, last1, src2_traits::begin(sf2), src2_traits::local(last2),
|
|
188
|
+
r.third, comp, src2_is_local_seg_t(), cat);
|
|
189
|
+
exit:
|
|
190
|
+
return result_t(r.first, src2_traits::compose(sf2, r.second), r.third);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
//////////////////////////////////////////////////////////////////////////////
|
|
195
|
+
// set_union_scan: exploits segmentation of range 1.
|
|
196
|
+
//
|
|
197
|
+
// Non-segmented src1: dispatches on src2 segmentation (guarded).
|
|
198
|
+
// Segmented src1: walks src1 segments, recurses on local src1.
|
|
199
|
+
//////////////////////////////////////////////////////////////////////////////
|
|
200
|
+
|
|
201
|
+
template <class FwdIt, class Sent, class InIter2, class Sent2, class OutIter, class Comp>
|
|
202
|
+
BOOST_CONTAINER_FORCEINLINE segtrio<FwdIt, InIter2, OutIter> set_union_scan
|
|
203
|
+
(FwdIt first1, Sent last1, InIter2 first2, Sent2 last2, OutIter result, Comp comp,
|
|
204
|
+
non_segmented_iterator_tag)
|
|
205
|
+
{
|
|
206
|
+
typedef sent_filter<FwdIt, Sent> sf1;
|
|
207
|
+
#if !defined(BOOST_CONTAINER_DISABLE_MULTI_SEGMENTED_ALGO)
|
|
208
|
+
typedef sent_filter<InIter2, Sent2> sf2;
|
|
209
|
+
|
|
210
|
+
return (set_union_seg2_dispatch)
|
|
211
|
+
(first1, last1, first2, last2, result, comp,
|
|
212
|
+
typename sf2::seg_t(),
|
|
213
|
+
typename sf1::cat_t());
|
|
214
|
+
#else
|
|
215
|
+
return (set_union_until_exhausts)
|
|
216
|
+
(first1, last1, first2, last2, result, comp,
|
|
217
|
+
non_segmented_iterator_tag(), typename sf1::cat_t());
|
|
218
|
+
#endif
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
template <class SegIt, class InIter2, class Sent2, class OutIter, class Comp>
|
|
222
|
+
segtrio<SegIt, InIter2, OutIter> set_union_scan
|
|
223
|
+
(SegIt first, SegIt last, InIter2 first2, Sent2 last2, OutIter result, Comp comp,
|
|
224
|
+
segmented_iterator_tag)
|
|
225
|
+
{
|
|
226
|
+
typedef segmented_iterator_traits<SegIt> traits;
|
|
227
|
+
typedef typename traits::local_iterator local_iterator;
|
|
228
|
+
typedef typename traits::segment_iterator segment_iterator;
|
|
229
|
+
typedef typename segmented_iterator_traits
|
|
230
|
+
<local_iterator>::is_segmented_iterator is_local_seg_t;
|
|
231
|
+
typedef segtrio<local_iterator, InIter2, OutIter> local_result_t;
|
|
232
|
+
typedef segtrio<SegIt, InIter2, OutIter> result_t;
|
|
233
|
+
|
|
234
|
+
if(first == last || first2 == last2)
|
|
235
|
+
return result_t(first, first2, result);
|
|
236
|
+
|
|
237
|
+
segment_iterator scur = traits::segment(first);
|
|
238
|
+
segment_iterator const slast = traits::segment(last);
|
|
239
|
+
local_iterator lcur = traits::local(first);
|
|
240
|
+
|
|
241
|
+
if(scur == slast) {
|
|
242
|
+
local_result_t r = set_union_scan
|
|
243
|
+
(lcur, traits::local(last), first2, last2, result, comp, is_local_seg_t());
|
|
244
|
+
return result_t(traits::compose(scur, r.first), r.second, r.third);
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
local_result_t r = set_union_scan
|
|
248
|
+
(lcur, traits::end(scur), first2, last2, result, comp, is_local_seg_t());
|
|
249
|
+
if(r.second == last2)
|
|
250
|
+
return result_t(traits::compose(scur, r.first), r.second, r.third);
|
|
251
|
+
|
|
252
|
+
for(++scur; scur != slast; ++scur) {
|
|
253
|
+
r = set_union_scan
|
|
254
|
+
(traits::begin(scur), traits::end(scur), r.second, last2, r.third, comp, is_local_seg_t());
|
|
255
|
+
if(r.second == last2)
|
|
256
|
+
return result_t(traits::compose(scur, r.first), r.second, r.third);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
r = set_union_scan
|
|
260
|
+
(traits::begin(scur), traits::local(last), r.second, last2, r.third, comp, is_local_seg_t());
|
|
261
|
+
return result_t(traits::compose(scur, r.first), r.second, r.third);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
} // namespace detail_algo
|
|
266
|
+
|
|
267
|
+
template <class InIter1, class Sent1, class InIter2, class Sent2, class OutIter, class Comp>
|
|
268
|
+
inline OutIter segmented_set_union
|
|
269
|
+
(InIter1 first1, Sent1 last1, InIter2 first2, Sent2 last2, OutIter result, Comp comp)
|
|
270
|
+
{
|
|
271
|
+
typedef detail_algo::sent_filter<InIter1, Sent1> sf;
|
|
272
|
+
segtrio<InIter1, InIter2, OutIter> r = detail_algo::set_union_scan
|
|
273
|
+
(first1, last1, first2, last2, result, comp, typename sf::seg_t());
|
|
274
|
+
// Drain both source residues; at most one of these is non-empty.
|
|
275
|
+
result = r.third;
|
|
276
|
+
if(r.first != last1)
|
|
277
|
+
result = (segmented_copy)(r.first, last1, result);
|
|
278
|
+
return (r.second == last2) ? result : (segmented_copy)(r.second, last2, result);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
template <class InIter1, class Sent1, class InIter2, class Sent2, class OutIter>
|
|
282
|
+
inline OutIter segmented_set_union
|
|
283
|
+
(InIter1 first1, Sent1 last1, InIter2 first2, Sent2 last2, OutIter result)
|
|
284
|
+
{
|
|
285
|
+
return boost::container::segmented_set_union
|
|
286
|
+
(first1, last1, first2, last2, result, detail_algo::segmented_default_less());
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
} // namespace container
|
|
290
|
+
} // namespace boost
|
|
291
|
+
|
|
292
|
+
#include <boost/container/detail/config_end.hpp>
|
|
293
|
+
|
|
294
|
+
#endif // BOOST_CONTAINER_EXPERIMENTAL_SEGMENTED_SET_UNION_HPP
|