passenger 6.0.23 → 6.0.24
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +26 -1
- data/Rakefile +7 -3
- data/bin/passenger-install-apache2-module +5 -0
- data/bin/passenger-install-nginx-module +17 -2
- data/build/apache2.rb +1 -1
- data/build/basics.rb +10 -4
- data/build/cxx_tests.rb +18 -7
- data/build/support/cxx_dependency_map.rb +40 -6
- data/build/test_basics.rb +4 -12
- data/package.json +1 -1
- data/passenger.gemspec +1 -1
- data/src/agent/Core/ApplicationPool/Group/InitializationAndShutdown.cpp +8 -0
- data/src/agent/Core/ApplicationPool/Group/InternalUtils.cpp +10 -2
- data/src/agent/Core/ApplicationPool/Group/LifetimeAndBasics.cpp +8 -0
- data/src/agent/Core/ApplicationPool/Group/Miscellaneous.cpp +9 -0
- data/src/agent/Core/ApplicationPool/Group/OutOfBandWork.cpp +9 -0
- data/src/agent/Core/ApplicationPool/Group/ProcessListManagement.cpp +63 -50
- data/src/agent/Core/ApplicationPool/Group/SessionManagement.cpp +19 -9
- data/src/agent/Core/ApplicationPool/Group/SpawningAndRestarting.cpp +8 -0
- data/src/agent/Core/ApplicationPool/Group/StateInspection.cpp +8 -0
- data/src/agent/Core/ApplicationPool/Group/Verification.cpp +8 -0
- data/src/agent/Core/ApplicationPool/Group.h +15 -5
- data/src/agent/Core/ApplicationPool/Pool/AnalyticsCollection.cpp +5 -0
- data/src/agent/Core/ApplicationPool/Pool/GarbageCollection.cpp +5 -0
- data/src/agent/Core/ApplicationPool/Pool/GeneralUtils.cpp +5 -0
- data/src/agent/Core/ApplicationPool/Pool/GroupUtils.cpp +5 -0
- data/src/agent/Core/ApplicationPool/Pool/InitializationAndShutdown.cpp +5 -0
- data/src/agent/Core/ApplicationPool/Pool/Miscellaneous.cpp +5 -0
- data/src/agent/Core/ApplicationPool/Pool/ProcessUtils.cpp +5 -0
- data/src/agent/Core/ApplicationPool/Pool/StateInspection.cpp +11 -1
- data/src/agent/Core/ApplicationPool/Pool.h +0 -2
- data/src/agent/Core/ApplicationPool/Process.h +22 -6
- data/src/agent/Core/ApplicationPool/Session.h +6 -1
- data/src/agent/Core/Config.h +7 -3
- data/src/agent/Core/Controller/Config.h +1 -1
- data/src/agent/Core/CoreMain.cpp +10 -17
- data/src/agent/Core/SpawningKit/Handshake/Prepare.h +1 -53
- data/src/agent/Core/SpawningKit/Handshake/Session.h +3 -0
- data/src/agent/Core/SpawningKit/Handshake/WorkDir.h +5 -2
- data/src/agent/Core/SpawningKit/SmartSpawner.h +6 -2
- data/src/agent/Core/SpawningKit/Spawner.h +4 -0
- data/src/agent/Shared/Fundamentals/AbortHandler.cpp +88 -9
- data/src/agent/Shared/Fundamentals/AbortHandler.h +2 -0
- data/src/agent/Shared/Fundamentals/Initialization.cpp +9 -3
- data/src/agent/Shared/Fundamentals/Initialization.h +3 -3
- data/src/agent/SpawnEnvSetupper/SpawnEnvSetupperMain.cpp +6 -7
- data/src/agent/Watchdog/Config.h +1 -1
- data/src/agent/Watchdog/WatchdogMain.cpp +4 -7
- data/src/apache2_module/ConfigGeneral/ManifestGeneration.h +5 -3
- data/src/apache2_module/DirConfig/AutoGeneratedStruct.h +3 -0
- data/src/apache2_module/DirConfig/AutoGeneratedStruct.h.cxxcodebuilder +3 -0
- data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h +2 -1
- data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h.cxxcodebuilder +2 -1
- data/src/cxx_supportlib/Constants.h +1 -1
- data/src/cxx_supportlib/DataStructures/StringMap.h +0 -1
- data/src/cxx_supportlib/FileTools/PathManip.cpp +1 -1
- data/src/cxx_supportlib/SafeLibev.h +1 -3
- data/src/cxx_supportlib/ServerKit/Hooks.h +2 -2
- data/src/cxx_supportlib/ServerKit/HttpHeaderParser.h +0 -1
- data/src/cxx_supportlib/ServerKit/HttpServer.h +15 -10
- data/src/cxx_supportlib/ServerKit/Server.h +0 -6
- data/src/cxx_supportlib/Utils/AsyncSignalSafeUtils.h +2 -0
- data/src/cxx_supportlib/Utils/SpeedMeter.h +0 -3
- data/src/cxx_supportlib/oxt/implementation.cpp +11 -0
- data/src/cxx_supportlib/oxt/system_calls.cpp +10 -3
- data/src/cxx_supportlib/oxt/thread.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/as_tuple.hpp +35 -9
- data/src/cxx_supportlib/vendor-modified/boost/asio/associated_immediate_executor.hpp +3 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/associator.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/async_result.hpp +74 -68
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_datagram_socket.hpp +11 -11
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_deadline_timer.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_random_access_file.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_raw_socket.hpp +10 -10
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_readable_pipe.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_seq_packet_socket.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_serial_port.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_signal_set.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket_acceptor.hpp +9 -9
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_stream_file.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_stream_socket.hpp +6 -6
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_waitable_timer.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/basic_writable_pipe.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/bind_allocator.hpp +88 -22
- data/src/cxx_supportlib/vendor-modified/boost/asio/bind_cancellation_slot.hpp +91 -22
- data/src/cxx_supportlib/vendor-modified/boost/asio/bind_executor.hpp +105 -23
- data/src/cxx_supportlib/vendor-modified/boost/asio/bind_immediate_executor.hpp +90 -23
- data/src/cxx_supportlib/vendor-modified/boost/asio/buffer.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/buffer_registration.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/cancel_after.hpp +303 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/cancel_at.hpp +296 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/impl/co_composed.hpp → co_composed.hpp} +208 -61
- data/src/cxx_supportlib/vendor-modified/boost/asio/completion_condition.hpp +49 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/compose.hpp +10 -201
- data/src/cxx_supportlib/vendor-modified/boost/asio/composed.hpp +415 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/connect.hpp +214 -48
- data/src/cxx_supportlib/vendor-modified/boost/asio/coroutine.hpp +3 -4
- data/src/cxx_supportlib/vendor-modified/boost/asio/default_completion_token.hpp +91 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/deferred.hpp +9 -5
- data/src/cxx_supportlib/vendor-modified/boost/asio/detached.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/buffered_stream_storage.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_message.hpp → detail/completion_message.hpp} +14 -16
- data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_payload.hpp → detail/completion_payload.hpp} +30 -32
- data/src/cxx_supportlib/vendor-modified/boost/asio/{experimental/detail/channel_handler.hpp → detail/completion_payload_handler.hpp} +15 -13
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/config.hpp +26 -32
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/deadline_timer_service.hpp +5 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_alloc_helpers.hpp +14 -118
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/descriptor_ops.ipp +36 -33
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/dev_poll_reactor.ipp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/reactive_descriptor_service.ipp +7 -5
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/reactive_socket_service_base.ipp +6 -4
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_ops.ipp +44 -35
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_select_interrupter.ipp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/initiation_base.hpp +64 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/memory.hpp +0 -11
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_descriptor_service.hpp +20 -16
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_send_op.hpp +0 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_service.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_service_base.hpp +23 -18
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/recycling_allocator.hpp +9 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_endpoint_op.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_query_op.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/thread_info_base.hpp +11 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timed_cancel_op.hpp +363 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/detail/wrapped_handler.hpp +29 -51
- data/src/cxx_supportlib/vendor-modified/boost/asio/execution/allocator.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/execution/blocking.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/execution/blocking_adaptation.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/execution/context.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/execution/mapping.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/execution/occupancy.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/execution/outstanding_work.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/execution/relationship.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/basic_channel.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/basic_concurrent_channel.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/co_composed.hpp +2 -114
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_receive_op.hpp +2 -3
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_send_functions.hpp +27 -19
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_send_op.hpp +0 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_service.hpp +17 -15
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/coro_promise_allocator.hpp +2 -3
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/impl/channel_service.hpp +4 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/partial_promise.hpp +3 -5
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/as_single.hpp +12 -7
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/coro.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/parallel_group.hpp +38 -40
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/promise.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/use_coro.hpp +5 -5
- data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/use_promise.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/immediate.hpp +144 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/append.hpp +14 -7
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/as_tuple.hpp +45 -14
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/awaitable.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/cancel_after.hpp +270 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/cancel_at.hpp +270 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/co_spawn.hpp +8 -0
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/connect.hpp +60 -166
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/consign.hpp +14 -7
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/detached.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/prepend.hpp +14 -7
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read.hpp +26 -177
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_at.hpp +16 -82
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_until.hpp +13 -286
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/redirect_error.hpp +55 -18
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/spawn.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/write.hpp +26 -185
- data/src/cxx_supportlib/vendor-modified/boost/asio/impl/write_at.hpp +16 -87
- data/src/cxx_supportlib/vendor-modified/boost/asio/io_context_strand.hpp +5 -5
- data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver.hpp +6 -6
- data/src/cxx_supportlib/vendor-modified/boost/asio/ip/detail/socket_option.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address_v6.ipp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/placeholders.hpp +12 -6
- data/src/cxx_supportlib/vendor-modified/boost/asio/posix/basic_descriptor.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/posix/basic_stream_descriptor.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/read.hpp +127 -28
- data/src/cxx_supportlib/vendor-modified/boost/asio/read_at.hpp +70 -20
- data/src/cxx_supportlib/vendor-modified/boost/asio/read_until.hpp +114 -36
- data/src/cxx_supportlib/vendor-modified/boost/asio/redirect_error.hpp +43 -3
- data/src/cxx_supportlib/vendor-modified/boost/asio/registered_buffer.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/spawn.hpp +0 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/impl/openssl_init.ipp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/context.ipp +10 -7
- data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/stream.hpp +5 -5
- data/src/cxx_supportlib/vendor-modified/boost/asio/this_coro.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/use_awaitable.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/asio/use_future.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/uses_executor.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/version.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/asio/write.hpp +147 -35
- data/src/cxx_supportlib/vendor-modified/boost/asio/write_at.hpp +74 -22
- data/src/cxx_supportlib/vendor-modified/boost/asio.hpp +6 -0
- data/src/cxx_supportlib/vendor-modified/boost/assert/source_location.hpp +4 -1
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/futex.hpp +42 -11
- data/src/cxx_supportlib/vendor-modified/boost/bind/bind.hpp +15 -37
- data/src/cxx_supportlib/vendor-modified/boost/container/adaptive_pool.hpp +8 -8
- data/src/cxx_supportlib/vendor-modified/boost/container/allocator.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/allocator_traits.hpp +151 -10
- data/src/cxx_supportlib/vendor-modified/boost/container/container_fwd.hpp +11 -9
- data/src/cxx_supportlib/vendor-modified/boost/container/deque.hpp +611 -102
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool_impl.hpp +47 -47
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/advanced_insert_int.hpp +25 -24
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/allocation_type.hpp +7 -7
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/block_list.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/block_slist.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/construct_in_place.hpp +35 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/copy_move_algo.hpp +14 -14
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/dispatch_uses_allocator.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/flat_tree.hpp +55 -23
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/function_detector.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_container.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_contiguous_container.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_pair.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/iterators.hpp +8 -8
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/math_functions.hpp +9 -9
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/mpl.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/multiallocation_chain.hpp +96 -10
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_alloc_holder.hpp +19 -4
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_pool.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/pair.hpp +17 -17
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_common.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_common_alloc.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_resource.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/tree.hpp +86 -52
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/version_type.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/workaround.hpp +12 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/devector.hpp +145 -65
- data/src/cxx_supportlib/vendor-modified/boost/container/flat_map.hpp +105 -22
- data/src/cxx_supportlib/vendor-modified/boost/container/flat_set.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/list.hpp +30 -22
- data/src/cxx_supportlib/vendor-modified/boost/container/map.hpp +19 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/new_allocator.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/node_allocator.hpp +15 -8
- data/src/cxx_supportlib/vendor-modified/boost/container/node_handle.hpp +6 -5
- data/src/cxx_supportlib/vendor-modified/boost/container/options.hpp +15 -15
- data/src/cxx_supportlib/vendor-modified/boost/container/pmr/memory_resource.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/pmr/monotonic_buffer_resource.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/pmr/resource_adaptor.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/container/scoped_allocator.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/set.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/slist.hpp +31 -24
- data/src/cxx_supportlib/vendor-modified/boost/container/small_vector.hpp +45 -43
- data/src/cxx_supportlib/vendor-modified/boost/container/stable_vector.hpp +45 -33
- data/src/cxx_supportlib/vendor-modified/boost/container/static_vector.hpp +5 -7
- data/src/cxx_supportlib/vendor-modified/boost/container/string.hpp +55 -47
- data/src/cxx_supportlib/vendor-modified/boost/container/uses_allocator.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/container/vector.hpp +222 -73
- data/src/cxx_supportlib/vendor-modified/boost/core/detail/minstd_rand.hpp +58 -0
- data/src/cxx_supportlib/vendor-modified/boost/core/detail/string_view.hpp +13 -13
- data/src/cxx_supportlib/vendor-modified/boost/core/empty_value.hpp +53 -5
- data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test.hpp +1 -0
- data/src/cxx_supportlib/vendor-modified/boost/core/pointer_in_range.hpp +49 -0
- data/src/cxx_supportlib/vendor-modified/boost/core/span.hpp +2 -0
- data/src/cxx_supportlib/vendor-modified/boost/core/type_name.hpp +7 -2
- data/src/cxx_supportlib/vendor-modified/boost/function/function_base.hpp +22 -34
- data/src/cxx_supportlib/vendor-modified/boost/function/function_template.hpp +141 -38
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/algorithm.hpp +8 -8
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hash.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hook_traits.hpp +8 -6
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/pointer_traits.hpp +18 -18
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical_streams.hpp +22 -17
- data/src/cxx_supportlib/vendor-modified/boost/libs/random/src/random_device.cpp +3 -1
- data/src/cxx_supportlib/vendor-modified/boost/move/detail/config_begin.hpp +0 -1
- data/src/cxx_supportlib/vendor-modified/boost/move/detail/launder.hpp +53 -0
- data/src/cxx_supportlib/vendor-modified/boost/move/detail/type_traits.hpp +9 -1
- data/src/cxx_supportlib/vendor-modified/boost/move/detail/workaround.hpp +6 -1
- data/src/cxx_supportlib/vendor-modified/boost/mp11/version.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/mpl/aux_/integral_wrapper.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/predef/version.h +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/requires_cxx11.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_has_gcc_intrinsics.hpp +4 -1
- data/src/cxx_supportlib/vendor-modified/boost/system/detail/generic_category_message.hpp +13 -1
- data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map.hpp +13 -1
- data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map_fwd.hpp +15 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_set.hpp +13 -1
- data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_set_fwd.hpp +15 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/fca.hpp +22 -6
- data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/concurrent_table.hpp +38 -10
- data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/core.hpp +111 -2
- data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/cumulative_stats.hpp +177 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/table.hpp +11 -1
- data/src/cxx_supportlib/vendor-modified/boost/unordered/hash_traits.hpp +33 -7
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map.hpp +12 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map_fwd.hpp +15 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set.hpp +12 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set_fwd.hpp +14 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_map_fwd.hpp +19 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map.hpp +12 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map_fwd.hpp +15 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set.hpp +12 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set_fwd.hpp +14 -0
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_set_fwd.hpp +17 -0
- data/src/cxx_supportlib/vendor-modified/boost/utility/detail/minstd_rand.hpp +1 -43
- data/src/cxx_supportlib/vendor-modified/boost/version.hpp +2 -2
- data/src/ruby_supportlib/phusion_passenger/config/compile_nginx_engine_command.rb +6 -2
- data/src/ruby_supportlib/phusion_passenger/config/install_standalone_runtime_command.rb +10 -0
- data/src/ruby_supportlib/phusion_passenger/config/nginx_engine_compiler.rb +12 -4
- data/src/ruby_supportlib/phusion_passenger/platform_info/compiler.rb +32 -5
- data/src/ruby_supportlib/phusion_passenger/standalone/start_command.rb +0 -4
- data/src/ruby_supportlib/phusion_passenger/utils/json.rb +5 -1
- data/src/ruby_supportlib/phusion_passenger/utils.rb +5 -15
- data/src/ruby_supportlib/phusion_passenger.rb +5 -5
- metadata +21 -8
@@ -68,16 +68,16 @@ template <class T>
|
|
68
68
|
struct deque_value_traits
|
69
69
|
{
|
70
70
|
typedef T value_type;
|
71
|
-
|
72
|
-
|
71
|
+
BOOST_STATIC_CONSTEXPR bool trivial_dctr = dtl::is_trivially_destructible<value_type>::value;
|
72
|
+
BOOST_STATIC_CONSTEXPR bool trivial_dctr_after_move = ::boost::has_trivial_destructor_after_move<value_type>::value;
|
73
73
|
};
|
74
74
|
|
75
75
|
template<class T, std::size_t BlockBytes, std::size_t BlockSize>
|
76
76
|
struct deque_block_size
|
77
77
|
{
|
78
78
|
BOOST_CONTAINER_STATIC_ASSERT_MSG(!(BlockBytes && BlockSize), "BlockBytes and BlockSize can't be specified at the same time");
|
79
|
-
|
80
|
-
|
79
|
+
BOOST_STATIC_CONSTEXPR std::size_t block_bytes = BlockBytes ? BlockBytes : 512u;
|
80
|
+
BOOST_STATIC_CONSTEXPR std::size_t value = BlockSize ? BlockSize : (sizeof(T) < block_bytes ? (block_bytes/sizeof(T)) : std::size_t(1));
|
81
81
|
};
|
82
82
|
|
83
83
|
namespace dtl {
|
@@ -106,6 +106,10 @@ namespace dtl {
|
|
106
106
|
// [map, map + map_size).
|
107
107
|
// A pointer in the range [map, map + map_size) points to an allocated node
|
108
108
|
// if and only if the pointer is in the range [start.node, finish.node].
|
109
|
+
|
110
|
+
#define BOOST_CONTAINER_DEQUE_LIGHTER_ITERATOR_LEVEL 0
|
111
|
+
|
112
|
+
#if BOOST_CONTAINER_DEQUE_LIGHTER_ITERATOR_LEVEL == 0
|
109
113
|
template<class Pointer, bool IsConst>
|
110
114
|
class deque_iterator
|
111
115
|
{
|
@@ -241,15 +245,15 @@ class deque_iterator
|
|
241
245
|
if (!n)
|
242
246
|
return *this;
|
243
247
|
BOOST_ASSERT(!!m_cur);
|
244
|
-
difference_type offset = n + (this->m_cur - this->m_first);
|
248
|
+
const difference_type offset = n + (this->m_cur - this->m_first);
|
245
249
|
const difference_type block_size = m_last - m_first;
|
246
250
|
BOOST_ASSERT(block_size);
|
247
251
|
if (offset >= 0 && offset < block_size)
|
248
252
|
this->m_cur += difference_type(n);
|
249
253
|
else {
|
250
|
-
difference_type node_offset =
|
251
|
-
|
252
|
-
|
254
|
+
const difference_type node_offset =
|
255
|
+
offset > 0 ? (offset / block_size)
|
256
|
+
: (-difference_type((-offset - 1) / block_size) - 1);
|
253
257
|
this->priv_set_node(this->m_node + node_offset, size_type(block_size));
|
254
258
|
this->m_cur = this->m_first +
|
255
259
|
(offset - node_offset * block_size);
|
@@ -313,6 +317,447 @@ class deque_iterator
|
|
313
317
|
}
|
314
318
|
};
|
315
319
|
|
320
|
+
#elif BOOST_CONTAINER_DEQUE_LIGHTER_ITERATOR_LEVEL == 1
|
321
|
+
|
322
|
+
template<class Pointer, bool IsConst, unsigned BlockBytes, unsigned BlockSize>
|
323
|
+
class deque_iterator
|
324
|
+
{
|
325
|
+
public:
|
326
|
+
typedef std::random_access_iterator_tag iterator_category;
|
327
|
+
typedef typename boost::intrusive::pointer_traits<Pointer>::element_type value_type;
|
328
|
+
typedef typename boost::intrusive::pointer_traits<Pointer>::difference_type difference_type;
|
329
|
+
typedef typename boost::intrusive::pointer_traits<Pointer>::size_type size_type;
|
330
|
+
typedef typename if_c
|
331
|
+
< IsConst
|
332
|
+
, typename boost::intrusive::pointer_traits<Pointer>::template
|
333
|
+
rebind_pointer<const value_type>::type
|
334
|
+
, Pointer
|
335
|
+
>::type pointer;
|
336
|
+
typedef typename if_c
|
337
|
+
< IsConst
|
338
|
+
, const value_type&
|
339
|
+
, value_type&
|
340
|
+
>::type reference;
|
341
|
+
|
342
|
+
BOOST_CONSTEXPR inline static size_type get_block_size() BOOST_NOEXCEPT_OR_NOTHROW
|
343
|
+
{ return deque_block_size<value_type, BlockBytes, BlockSize>::value; }
|
344
|
+
|
345
|
+
BOOST_CONSTEXPR inline static difference_type get_block_ssize() BOOST_NOEXCEPT_OR_NOTHROW
|
346
|
+
{ return difference_type((get_block_size())); }
|
347
|
+
|
348
|
+
class nat;
|
349
|
+
typedef typename dtl::if_c< IsConst
|
350
|
+
, deque_iterator<Pointer, false, BlockBytes, BlockSize>
|
351
|
+
, nat>::type nonconst_iterator;
|
352
|
+
|
353
|
+
typedef Pointer val_alloc_ptr;
|
354
|
+
typedef typename boost::intrusive::pointer_traits<Pointer>::
|
355
|
+
template rebind_pointer<Pointer>::type index_pointer;
|
356
|
+
|
357
|
+
Pointer m_cur;
|
358
|
+
Pointer m_first;
|
359
|
+
index_pointer m_node;
|
360
|
+
|
361
|
+
public:
|
362
|
+
|
363
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline Pointer get_cur() const { return m_cur; }
|
364
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline Pointer get_first() const { return m_first; }
|
365
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline Pointer get_last() const { return m_first + get_block_ssize(); }
|
366
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline index_pointer get_node() const { return m_node; }
|
367
|
+
|
368
|
+
inline deque_iterator(val_alloc_ptr x, index_pointer y, difference_type ) BOOST_NOEXCEPT_OR_NOTHROW
|
369
|
+
: m_cur(x), m_first(*y), m_node(y)
|
370
|
+
{}
|
371
|
+
|
372
|
+
inline deque_iterator(val_alloc_ptr x, index_pointer y, size_type ) BOOST_NOEXCEPT_OR_NOTHROW
|
373
|
+
: m_cur(x), m_first(*y), m_node(y)
|
374
|
+
{}
|
375
|
+
|
376
|
+
inline deque_iterator() BOOST_NOEXCEPT_OR_NOTHROW
|
377
|
+
: m_cur(), m_first(), m_node() //Value initialization to achieve "null iterators" (N3644)
|
378
|
+
{}
|
379
|
+
|
380
|
+
inline deque_iterator(const deque_iterator& x) BOOST_NOEXCEPT_OR_NOTHROW
|
381
|
+
: m_cur(x.get_cur()), m_first(x.get_first()), m_node(x.get_node())
|
382
|
+
{}
|
383
|
+
|
384
|
+
inline deque_iterator(const nonconst_iterator& x) BOOST_NOEXCEPT_OR_NOTHROW
|
385
|
+
: m_cur(x.get_cur()), m_first(x.get_first()), m_node(x.get_node())
|
386
|
+
{}
|
387
|
+
|
388
|
+
inline deque_iterator(Pointer cur, Pointer first, index_pointer node) BOOST_NOEXCEPT_OR_NOTHROW
|
389
|
+
: m_cur(cur), m_first(first), m_node(node)
|
390
|
+
{}
|
391
|
+
|
392
|
+
inline deque_iterator& operator=(const deque_iterator& x) BOOST_NOEXCEPT_OR_NOTHROW
|
393
|
+
{ m_cur = x.get_cur(); m_first = x.get_first(); m_node = x.get_node(); return *this; }
|
394
|
+
|
395
|
+
inline nonconst_iterator unconst() const BOOST_NOEXCEPT_OR_NOTHROW
|
396
|
+
{
|
397
|
+
return nonconst_iterator(this->get_cur(), this->get_first(), this->get_node());
|
398
|
+
}
|
399
|
+
|
400
|
+
inline reference operator*() const BOOST_NOEXCEPT_OR_NOTHROW
|
401
|
+
{ return *this->m_cur; }
|
402
|
+
|
403
|
+
inline pointer operator->() const BOOST_NOEXCEPT_OR_NOTHROW
|
404
|
+
{ return this->m_cur; }
|
405
|
+
|
406
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD difference_type operator-(const deque_iterator& x) const BOOST_NOEXCEPT_OR_NOTHROW
|
407
|
+
{
|
408
|
+
if(!this->m_cur && !x.m_cur){
|
409
|
+
return 0;
|
410
|
+
}
|
411
|
+
const difference_type block_size = get_block_ssize();
|
412
|
+
BOOST_ASSERT(block_size);
|
413
|
+
return block_size * (this->m_node - x.m_node - 1) +
|
414
|
+
(this->m_cur - this->m_first) + ((x.m_first+block_size) - x.m_cur);
|
415
|
+
}
|
416
|
+
|
417
|
+
deque_iterator& operator++() BOOST_NOEXCEPT_OR_NOTHROW
|
418
|
+
{
|
419
|
+
BOOST_ASSERT(!!m_cur);
|
420
|
+
++this->m_cur;
|
421
|
+
const difference_type block_size = get_block_ssize();
|
422
|
+
if (this->m_cur == (this->m_first+block_size)) {
|
423
|
+
|
424
|
+
BOOST_ASSERT(block_size);
|
425
|
+
++this->m_node;
|
426
|
+
this->m_first = *this->m_node;
|
427
|
+
this->m_cur = this->m_first;
|
428
|
+
}
|
429
|
+
return *this;
|
430
|
+
}
|
431
|
+
|
432
|
+
inline deque_iterator operator++(int) BOOST_NOEXCEPT_OR_NOTHROW
|
433
|
+
{
|
434
|
+
deque_iterator tmp(*this);
|
435
|
+
++*this;
|
436
|
+
return tmp;
|
437
|
+
}
|
438
|
+
|
439
|
+
deque_iterator& operator--() BOOST_NOEXCEPT_OR_NOTHROW
|
440
|
+
{
|
441
|
+
BOOST_ASSERT(!!m_cur);
|
442
|
+
if (this->m_cur == this->m_first) {
|
443
|
+
--this->m_node;
|
444
|
+
this->m_first = *this->m_node;
|
445
|
+
this->m_cur = this->m_first + get_block_ssize();
|
446
|
+
}
|
447
|
+
--this->m_cur;
|
448
|
+
return *this;
|
449
|
+
}
|
450
|
+
|
451
|
+
inline deque_iterator operator--(int) BOOST_NOEXCEPT_OR_NOTHROW
|
452
|
+
{
|
453
|
+
deque_iterator tmp(*this);
|
454
|
+
--*this;
|
455
|
+
return tmp;
|
456
|
+
}
|
457
|
+
|
458
|
+
deque_iterator& operator+=(difference_type n) BOOST_NOEXCEPT_OR_NOTHROW
|
459
|
+
{
|
460
|
+
if (!n)
|
461
|
+
return *this;
|
462
|
+
BOOST_ASSERT(!!m_cur);
|
463
|
+
const difference_type offset = n + (this->m_cur - this->m_first);
|
464
|
+
const difference_type block_size = get_block_ssize();
|
465
|
+
BOOST_ASSERT(block_size);
|
466
|
+
if (offset >= 0 && offset < block_size)
|
467
|
+
this->m_cur += difference_type(n);
|
468
|
+
else {
|
469
|
+
const difference_type node_offset =
|
470
|
+
offset > 0 ? (offset / block_size)
|
471
|
+
: (-difference_type((-offset - 1) / block_size) - 1);
|
472
|
+
this->m_node += node_offset;
|
473
|
+
this->m_first = *this->m_node;
|
474
|
+
this->m_cur = this->m_first + (offset - node_offset * block_size);
|
475
|
+
}
|
476
|
+
return *this;
|
477
|
+
}
|
478
|
+
|
479
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
|
480
|
+
deque_iterator operator+(difference_type n) const BOOST_NOEXCEPT_OR_NOTHROW
|
481
|
+
{ deque_iterator tmp(*this); return tmp += n; }
|
482
|
+
|
483
|
+
inline
|
484
|
+
deque_iterator& operator-=(difference_type n) BOOST_NOEXCEPT_OR_NOTHROW
|
485
|
+
{ return *this += -n; }
|
486
|
+
|
487
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
|
488
|
+
deque_iterator operator-(difference_type n) const BOOST_NOEXCEPT_OR_NOTHROW
|
489
|
+
{ deque_iterator tmp(*this); return tmp -= n; }
|
490
|
+
|
491
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
|
492
|
+
reference operator[](difference_type n) const BOOST_NOEXCEPT_OR_NOTHROW
|
493
|
+
{ return *(*this + n); }
|
494
|
+
|
495
|
+
//Comparisons
|
496
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
|
497
|
+
friend bool operator==(const deque_iterator& l, const deque_iterator& r) BOOST_NOEXCEPT_OR_NOTHROW
|
498
|
+
{ return l.m_cur == r.m_cur; }
|
499
|
+
|
500
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
|
501
|
+
friend bool operator!=(const deque_iterator& l, const deque_iterator& r) BOOST_NOEXCEPT_OR_NOTHROW
|
502
|
+
{ return l.m_cur != r.m_cur; }
|
503
|
+
|
504
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
|
505
|
+
friend bool operator<(const deque_iterator& l, const deque_iterator& r) BOOST_NOEXCEPT_OR_NOTHROW
|
506
|
+
{ return (l.m_node == r.m_node) ? (l.m_cur < r.m_cur) : (l.m_node < r.m_node); }
|
507
|
+
|
508
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
|
509
|
+
friend bool operator>(const deque_iterator& l, const deque_iterator& r) BOOST_NOEXCEPT_OR_NOTHROW
|
510
|
+
{ return r < l; }
|
511
|
+
|
512
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
|
513
|
+
friend bool operator<=(const deque_iterator& l, const deque_iterator& r) BOOST_NOEXCEPT_OR_NOTHROW
|
514
|
+
{ return !(r < l); }
|
515
|
+
|
516
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
|
517
|
+
friend bool operator>=(const deque_iterator& l, const deque_iterator& r) BOOST_NOEXCEPT_OR_NOTHROW
|
518
|
+
{ return !(l < r); }
|
519
|
+
|
520
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
|
521
|
+
friend deque_iterator operator+(difference_type n, deque_iterator x) BOOST_NOEXCEPT_OR_NOTHROW
|
522
|
+
{ return x += n; }
|
523
|
+
|
524
|
+
inline void priv_set_node(index_pointer new_node, size_type ) BOOST_NOEXCEPT_OR_NOTHROW
|
525
|
+
{ return this->priv_set_node(new_node, difference_type()); }
|
526
|
+
|
527
|
+
inline void priv_set_node(index_pointer new_node, difference_type) BOOST_NOEXCEPT_OR_NOTHROW
|
528
|
+
{
|
529
|
+
this->m_node = new_node;
|
530
|
+
this->m_first = *new_node;
|
531
|
+
}
|
532
|
+
};
|
533
|
+
|
534
|
+
#elif BOOST_CONTAINER_DEQUE_LIGHTER_ITERATOR_LEVEL == 2
|
535
|
+
|
536
|
+
template<class Pointer, bool IsConst, unsigned BlockBytes, unsigned BlockSize>
|
537
|
+
class deque_iterator
|
538
|
+
{
|
539
|
+
public:
|
540
|
+
typedef std::random_access_iterator_tag iterator_category;
|
541
|
+
typedef typename boost::intrusive::pointer_traits<Pointer>::element_type value_type;
|
542
|
+
typedef typename boost::intrusive::pointer_traits<Pointer>::difference_type difference_type;
|
543
|
+
typedef typename boost::intrusive::pointer_traits<Pointer>::size_type size_type;
|
544
|
+
typedef typename if_c
|
545
|
+
< IsConst
|
546
|
+
, typename boost::intrusive::pointer_traits<Pointer>::template
|
547
|
+
rebind_pointer<const value_type>::type
|
548
|
+
, Pointer
|
549
|
+
>::type pointer;
|
550
|
+
typedef typename if_c
|
551
|
+
< IsConst
|
552
|
+
, const value_type&
|
553
|
+
, value_type&
|
554
|
+
>::type reference;
|
555
|
+
|
556
|
+
BOOST_CONSTEXPR inline static size_type get_block_size() BOOST_NOEXCEPT_OR_NOTHROW
|
557
|
+
{
|
558
|
+
BOOST_CONTAINER_STATIC_ASSERT((deque_block_size<value_type, BlockBytes, BlockSize>::value));
|
559
|
+
return deque_block_size<value_type, BlockBytes, BlockSize>::value;
|
560
|
+
}
|
561
|
+
|
562
|
+
BOOST_CONSTEXPR inline static difference_type get_block_ssize() BOOST_NOEXCEPT_OR_NOTHROW
|
563
|
+
{ return difference_type((get_block_size())); }
|
564
|
+
|
565
|
+
class nat;
|
566
|
+
typedef typename dtl::if_c< IsConst
|
567
|
+
, deque_iterator<Pointer, false, BlockBytes, BlockSize>
|
568
|
+
, nat>::type nonconst_iterator;
|
569
|
+
|
570
|
+
typedef Pointer val_alloc_ptr;
|
571
|
+
typedef typename boost::intrusive::pointer_traits<Pointer>::
|
572
|
+
template rebind_pointer<Pointer>::type index_pointer;
|
573
|
+
|
574
|
+
Pointer m_cur;
|
575
|
+
index_pointer m_node;
|
576
|
+
|
577
|
+
public:
|
578
|
+
|
579
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline Pointer get_cur() const { return m_cur; }
|
580
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline Pointer get_first() const { return *m_node; }
|
581
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline Pointer get_last() const { return *m_node + get_block_ssize(); }
|
582
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline index_pointer get_node() const { return m_node; }
|
583
|
+
|
584
|
+
inline deque_iterator(val_alloc_ptr x, index_pointer y, difference_type ) BOOST_NOEXCEPT_OR_NOTHROW
|
585
|
+
: m_cur(x), m_node(y)
|
586
|
+
{}
|
587
|
+
|
588
|
+
inline deque_iterator(val_alloc_ptr x, index_pointer y, size_type ) BOOST_NOEXCEPT_OR_NOTHROW
|
589
|
+
: m_cur(x), m_node(y)
|
590
|
+
{}
|
591
|
+
|
592
|
+
inline deque_iterator() BOOST_NOEXCEPT_OR_NOTHROW
|
593
|
+
: m_cur(), m_node() //Value initialization to achieve "null iterators" (N3644)
|
594
|
+
{}
|
595
|
+
|
596
|
+
inline deque_iterator(const deque_iterator& x) BOOST_NOEXCEPT_OR_NOTHROW
|
597
|
+
: m_cur(x.get_cur()), m_node(x.get_node())
|
598
|
+
{}
|
599
|
+
|
600
|
+
inline deque_iterator(const nonconst_iterator& x) BOOST_NOEXCEPT_OR_NOTHROW
|
601
|
+
: m_cur(x.get_cur()), m_node(x.get_node())
|
602
|
+
{}
|
603
|
+
|
604
|
+
inline deque_iterator(Pointer cur, index_pointer node) BOOST_NOEXCEPT_OR_NOTHROW
|
605
|
+
: m_cur(cur), m_node(node)
|
606
|
+
{}
|
607
|
+
|
608
|
+
inline deque_iterator& operator=(const deque_iterator& x) BOOST_NOEXCEPT_OR_NOTHROW
|
609
|
+
{ m_cur = x.get_cur(); m_node = x.get_node(); return *this; }
|
610
|
+
|
611
|
+
inline nonconst_iterator unconst() const BOOST_NOEXCEPT_OR_NOTHROW
|
612
|
+
{
|
613
|
+
return nonconst_iterator(this->get_cur(), this->get_node());
|
614
|
+
}
|
615
|
+
|
616
|
+
inline reference operator*() const BOOST_NOEXCEPT_OR_NOTHROW
|
617
|
+
{ return *this->m_cur; }
|
618
|
+
|
619
|
+
inline pointer operator->() const BOOST_NOEXCEPT_OR_NOTHROW
|
620
|
+
{ return this->m_cur; }
|
621
|
+
|
622
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD difference_type operator-(const deque_iterator& x) const BOOST_NOEXCEPT_OR_NOTHROW
|
623
|
+
{
|
624
|
+
if(!this->m_cur && !x.m_cur){
|
625
|
+
return 0;
|
626
|
+
}
|
627
|
+
const difference_type block_size = get_block_ssize();
|
628
|
+
BOOST_ASSERT(block_size);
|
629
|
+
return block_size * (this->m_node - x.m_node - 1) +
|
630
|
+
(this->m_cur - this->get_first()) + (x.get_last() - x.m_cur);
|
631
|
+
}
|
632
|
+
|
633
|
+
deque_iterator& operator++() BOOST_NOEXCEPT_OR_NOTHROW
|
634
|
+
{
|
635
|
+
BOOST_ASSERT(!!m_cur);
|
636
|
+
++this->m_cur;
|
637
|
+
if (this->m_cur == (this->get_last())) {
|
638
|
+
|
639
|
+
++this->m_node;
|
640
|
+
this->m_cur = *this->m_node;
|
641
|
+
}
|
642
|
+
return *this;
|
643
|
+
}
|
644
|
+
|
645
|
+
inline deque_iterator operator++(int) BOOST_NOEXCEPT_OR_NOTHROW
|
646
|
+
{
|
647
|
+
deque_iterator tmp(*this);
|
648
|
+
++*this;
|
649
|
+
return tmp;
|
650
|
+
}
|
651
|
+
|
652
|
+
deque_iterator& operator--() BOOST_NOEXCEPT_OR_NOTHROW
|
653
|
+
{
|
654
|
+
BOOST_ASSERT(!!m_cur);
|
655
|
+
if (this->m_cur == this->get_first()) {
|
656
|
+
--this->m_node;
|
657
|
+
this->m_cur = this->get_last();
|
658
|
+
}
|
659
|
+
--this->m_cur;
|
660
|
+
return *this;
|
661
|
+
}
|
662
|
+
|
663
|
+
inline deque_iterator operator--(int) BOOST_NOEXCEPT_OR_NOTHROW
|
664
|
+
{
|
665
|
+
deque_iterator tmp(*this);
|
666
|
+
--*this;
|
667
|
+
return tmp;
|
668
|
+
}
|
669
|
+
|
670
|
+
deque_iterator& operator+=(difference_type n) BOOST_NOEXCEPT_OR_NOTHROW
|
671
|
+
{
|
672
|
+
if (!n)
|
673
|
+
return *this;
|
674
|
+
BOOST_ASSERT(!!m_cur);
|
675
|
+
const difference_type offset = n + (this->m_cur - this->get_first());
|
676
|
+
const difference_type block_size = get_block_ssize();
|
677
|
+
BOOST_ASSERT(block_size);
|
678
|
+
if (offset >= 0 && offset < block_size)
|
679
|
+
this->m_cur += difference_type(n);
|
680
|
+
else {
|
681
|
+
const difference_type node_offset =
|
682
|
+
offset > 0 ? (offset / block_size)
|
683
|
+
: (-difference_type((-offset - 1) / block_size) - 1);
|
684
|
+
this->m_node += node_offset;
|
685
|
+
this->m_cur = this->get_first() + (offset - node_offset * block_size);
|
686
|
+
}
|
687
|
+
return *this;
|
688
|
+
}
|
689
|
+
|
690
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
|
691
|
+
deque_iterator operator+(difference_type n) const BOOST_NOEXCEPT_OR_NOTHROW
|
692
|
+
{ deque_iterator tmp(*this); return tmp += n; }
|
693
|
+
|
694
|
+
inline
|
695
|
+
deque_iterator& operator-=(difference_type n) BOOST_NOEXCEPT_OR_NOTHROW
|
696
|
+
{ return *this += -n; }
|
697
|
+
|
698
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
|
699
|
+
deque_iterator operator-(difference_type n) const BOOST_NOEXCEPT_OR_NOTHROW
|
700
|
+
{ deque_iterator tmp(*this); return tmp -= n; }
|
701
|
+
|
702
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
|
703
|
+
reference operator[](difference_type n) const BOOST_NOEXCEPT_OR_NOTHROW
|
704
|
+
{
|
705
|
+
BOOST_ASSERT(!!m_cur);
|
706
|
+
const difference_type offset = n + (this->m_cur - this->get_first());
|
707
|
+
const difference_type block_size = get_block_ssize();
|
708
|
+
if (offset >= 0 && offset < block_size)
|
709
|
+
return this->m_cur[difference_type(n)];
|
710
|
+
else {
|
711
|
+
const difference_type node_offset = offset > 0
|
712
|
+
? (offset / block_size)
|
713
|
+
: (-difference_type((-offset - 1) / block_size) - 1);
|
714
|
+
return (this->m_node[node_offset]) [offset - node_offset * block_size];
|
715
|
+
}
|
716
|
+
}
|
717
|
+
|
718
|
+
//Comparisons
|
719
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
|
720
|
+
friend bool operator==(const deque_iterator& l, const deque_iterator& r) BOOST_NOEXCEPT_OR_NOTHROW
|
721
|
+
{ return l.m_cur == r.m_cur; }
|
722
|
+
|
723
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
|
724
|
+
friend bool operator!=(const deque_iterator& l, const deque_iterator& r) BOOST_NOEXCEPT_OR_NOTHROW
|
725
|
+
{ return l.m_cur != r.m_cur; }
|
726
|
+
|
727
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
|
728
|
+
friend bool operator<(const deque_iterator& l, const deque_iterator& r) BOOST_NOEXCEPT_OR_NOTHROW
|
729
|
+
{ return (l.m_node == r.m_node) ? (l.m_cur < r.m_cur) : (l.m_node < r.m_node); }
|
730
|
+
|
731
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
|
732
|
+
friend bool operator>(const deque_iterator& l, const deque_iterator& r) BOOST_NOEXCEPT_OR_NOTHROW
|
733
|
+
{ return r < l; }
|
734
|
+
|
735
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
|
736
|
+
friend bool operator<=(const deque_iterator& l, const deque_iterator& r) BOOST_NOEXCEPT_OR_NOTHROW
|
737
|
+
{ return !(r < l); }
|
738
|
+
|
739
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
|
740
|
+
friend bool operator>=(const deque_iterator& l, const deque_iterator& r) BOOST_NOEXCEPT_OR_NOTHROW
|
741
|
+
{ return !(l < r); }
|
742
|
+
|
743
|
+
BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
|
744
|
+
friend deque_iterator operator+(difference_type n, deque_iterator x) BOOST_NOEXCEPT_OR_NOTHROW
|
745
|
+
{ return x += n; }
|
746
|
+
|
747
|
+
inline void priv_set_node(index_pointer new_node, size_type ) BOOST_NOEXCEPT_OR_NOTHROW
|
748
|
+
{ return this->priv_set_node(new_node, difference_type()); }
|
749
|
+
|
750
|
+
inline void priv_set_node(index_pointer new_node, difference_type) BOOST_NOEXCEPT_OR_NOTHROW
|
751
|
+
{
|
752
|
+
this->m_node = new_node;
|
753
|
+
}
|
754
|
+
};
|
755
|
+
|
756
|
+
#else
|
757
|
+
|
758
|
+
#error "Invalid BOOST_CONTAINER_DEQUE_LIGHTER_ITERATOR_LEVEL"
|
759
|
+
|
760
|
+
#endif
|
316
761
|
} //namespace dtl {
|
317
762
|
|
318
763
|
template<class Options>
|
@@ -360,15 +805,20 @@ class deque_base
|
|
360
805
|
typedef typename get_deque_opt<Options>::type options_type;
|
361
806
|
|
362
807
|
protected:
|
808
|
+
#if BOOST_CONTAINER_DEQUE_LIGHTER_ITERATOR_LEVEL == 0
|
363
809
|
typedef dtl::deque_iterator<val_alloc_ptr, false> iterator;
|
364
|
-
typedef dtl::deque_iterator<val_alloc_ptr, true
|
810
|
+
typedef dtl::deque_iterator<val_alloc_ptr, true> const_iterator;
|
811
|
+
#else
|
812
|
+
typedef dtl::deque_iterator<val_alloc_ptr, false, options_type::block_bytes, options_type::block_size> iterator;
|
813
|
+
typedef dtl::deque_iterator<val_alloc_ptr, true, options_type::block_bytes, options_type::block_size> const_iterator;
|
814
|
+
#endif
|
815
|
+
|
816
|
+
BOOST_CONSTEXPR inline static val_alloc_diff get_block_ssize() BOOST_NOEXCEPT_OR_NOTHROW
|
817
|
+
{ return val_alloc_diff((get_block_size())); }
|
365
818
|
|
366
819
|
BOOST_CONSTEXPR inline static size_type get_block_size() BOOST_NOEXCEPT_OR_NOTHROW
|
367
820
|
{ return deque_block_size<val_alloc_val, options_type::block_bytes, options_type::block_size>::value; }
|
368
821
|
|
369
|
-
BOOST_CONSTEXPR inline static val_alloc_diff get_block_ssize() BOOST_NOEXCEPT_OR_NOTHROW
|
370
|
-
{ return val_alloc_diff((get_block_size)()); }
|
371
|
-
|
372
822
|
typedef deque_value_traits<val_alloc_val> traits_t;
|
373
823
|
typedef ptr_alloc_t map_allocator_type;
|
374
824
|
|
@@ -446,8 +896,8 @@ class deque_base
|
|
446
896
|
|
447
897
|
this->members_.m_start.priv_set_node(nstart, get_block_size());
|
448
898
|
this->members_.m_finish.priv_set_node(nfinish - 1, get_block_size());
|
449
|
-
this->members_.m_start.m_cur = this->members_.m_start.
|
450
|
-
this->members_.m_finish.m_cur = this->members_.m_finish.
|
899
|
+
this->members_.m_start.m_cur = this->members_.m_start.get_first();
|
900
|
+
this->members_.m_finish.m_cur = this->members_.m_finish.get_first() + difference_type(num_elements % get_block_size());
|
451
901
|
// }
|
452
902
|
}
|
453
903
|
|
@@ -868,28 +1318,13 @@ class deque : protected deque_base<typename real_allocator<T, Allocator>::type,
|
|
868
1318
|
|| allocator_traits_type::is_always_equal::value)
|
869
1319
|
{
|
870
1320
|
if (BOOST_LIKELY(this != &x)) {
|
871
|
-
|
872
|
-
|
873
|
-
const bool
|
874
|
-
|
875
|
-
|
876
|
-
|
877
|
-
|
878
|
-
//going to be equal after this function (either propagated or already equal)
|
879
|
-
if(propagate_alloc || allocators_equal){
|
880
|
-
//Destroy objects but retain memory in case x reuses it in the future
|
881
|
-
this->clear();
|
882
|
-
//Move allocator if needed
|
883
|
-
dtl::move_alloc(this_alloc, x_alloc, flag);
|
884
|
-
dtl::move_alloc(this->ptr_alloc(), x.ptr_alloc(), flag);
|
885
|
-
//Nothrow swap
|
886
|
-
this->swap_members(x);
|
887
|
-
}
|
888
|
-
//Else do a one by one move
|
889
|
-
else{
|
890
|
-
this->assign( boost::make_move_iterator(x.begin())
|
891
|
-
, boost::make_move_iterator(x.end()));
|
892
|
-
}
|
1321
|
+
//We know resources can be transferred at comiple time if both allocators are
|
1322
|
+
//always equal or the allocator is going to be propagated
|
1323
|
+
const bool can_steal_resources_alloc
|
1324
|
+
= allocator_traits_type::propagate_on_container_move_assignment::value
|
1325
|
+
|| allocator_traits_type::is_always_equal::value;
|
1326
|
+
dtl::bool_<can_steal_resources_alloc> flag;
|
1327
|
+
this->priv_move_assign(boost::move(x), flag);
|
893
1328
|
}
|
894
1329
|
return *this;
|
895
1330
|
}
|
@@ -1741,7 +2176,7 @@ class deque : protected deque_base<typename real_allocator<T, Allocator>::type,
|
|
1741
2176
|
void pop_front() BOOST_NOEXCEPT_OR_NOTHROW
|
1742
2177
|
{
|
1743
2178
|
BOOST_ASSERT(!this->empty());
|
1744
|
-
if (this->members_.m_start.m_cur != this->members_.m_start.
|
2179
|
+
if (this->members_.m_start.m_cur != this->members_.m_start.get_last() - 1) {
|
1745
2180
|
allocator_traits_type::destroy
|
1746
2181
|
( this->alloc()
|
1747
2182
|
, boost::movelib::to_raw_pointer(this->members_.m_start.m_cur)
|
@@ -1760,7 +2195,7 @@ class deque : protected deque_base<typename real_allocator<T, Allocator>::type,
|
|
1760
2195
|
void pop_back() BOOST_NOEXCEPT_OR_NOTHROW
|
1761
2196
|
{
|
1762
2197
|
BOOST_ASSERT(!this->empty());
|
1763
|
-
if (this->members_.m_finish.m_cur != this->members_.m_finish.
|
2198
|
+
if (this->members_.m_finish.m_cur != this->members_.m_finish.get_first()) {
|
1764
2199
|
--this->members_.m_finish.m_cur;
|
1765
2200
|
allocator_traits_type::destroy
|
1766
2201
|
( this->alloc()
|
@@ -1865,9 +2300,9 @@ class deque : protected deque_base<typename real_allocator<T, Allocator>::type,
|
|
1865
2300
|
}
|
1866
2301
|
|
1867
2302
|
if (this->members_.m_start.m_node != this->members_.m_finish.m_node) {
|
1868
|
-
this->priv_destroy_range(this->members_.m_start.m_cur, this->members_.m_start.
|
1869
|
-
this->priv_destroy_range(this->members_.m_finish.
|
1870
|
-
this->priv_deallocate_node(this->members_.m_finish.
|
2303
|
+
this->priv_destroy_range(this->members_.m_start.m_cur, this->members_.m_start.get_last());
|
2304
|
+
this->priv_destroy_range(this->members_.m_finish.get_first(), this->members_.m_finish.m_cur);
|
2305
|
+
this->priv_deallocate_node(this->members_.m_finish.get_first());
|
1871
2306
|
}
|
1872
2307
|
else
|
1873
2308
|
this->priv_destroy_range(this->members_.m_start.m_cur, this->members_.m_finish.m_cur);
|
@@ -1928,6 +2363,30 @@ class deque : protected deque_base<typename real_allocator<T, Allocator>::type,
|
|
1928
2363
|
#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
|
1929
2364
|
private:
|
1930
2365
|
|
2366
|
+
void priv_move_assign(BOOST_RV_REF(deque) x, dtl::bool_<true> /*steal_resources*/)
|
2367
|
+
{
|
2368
|
+
//Destroy objects but retain memory in case x reuses it in the future
|
2369
|
+
this->clear();
|
2370
|
+
//Move allocator if needed
|
2371
|
+
dtl::bool_<allocator_traits_type::propagate_on_container_move_assignment::value> flag;
|
2372
|
+
dtl::move_alloc(this->alloc(), x.alloc(), flag);
|
2373
|
+
dtl::move_alloc(this->ptr_alloc(), x.ptr_alloc(), flag);
|
2374
|
+
//Nothrow swap
|
2375
|
+
this->swap_members(x);
|
2376
|
+
}
|
2377
|
+
|
2378
|
+
void priv_move_assign(BOOST_RV_REF(deque) x, dtl::bool_<false> /*steal_resources*/)
|
2379
|
+
{
|
2380
|
+
//We can't guarantee a compile-time equal allocator or propagation so fallback to runtime
|
2381
|
+
//Resources can be transferred if both allocators are equal
|
2382
|
+
if (this->alloc() == x.alloc()) {
|
2383
|
+
this->priv_move_assign(boost::move(x), dtl::true_());
|
2384
|
+
}
|
2385
|
+
else {
|
2386
|
+
this->assign(boost::make_move_iterator(x.begin()), boost::make_move_iterator(x.end()));
|
2387
|
+
}
|
2388
|
+
}
|
2389
|
+
|
1931
2390
|
inline size_type priv_index_of(const_iterator p) const
|
1932
2391
|
{
|
1933
2392
|
BOOST_ASSERT(this->cbegin() <= p);
|
@@ -2016,7 +2475,7 @@ class deque : protected deque_base<typename real_allocator<T, Allocator>::type,
|
|
2016
2475
|
inline bool priv_push_back_simple_available() const
|
2017
2476
|
{
|
2018
2477
|
return this->members_.m_map &&
|
2019
|
-
(this->members_.m_finish.m_cur != (this->members_.m_finish.
|
2478
|
+
(this->members_.m_finish.m_cur != (this->members_.m_finish.get_last() - 1));
|
2020
2479
|
}
|
2021
2480
|
|
2022
2481
|
inline T *priv_push_back_simple_pos() const
|
@@ -2032,7 +2491,7 @@ class deque : protected deque_base<typename real_allocator<T, Allocator>::type,
|
|
2032
2491
|
inline bool priv_push_front_simple_available() const
|
2033
2492
|
{
|
2034
2493
|
return this->members_.m_map &&
|
2035
|
-
(this->members_.m_start.m_cur != this->members_.m_start.
|
2494
|
+
(this->members_.m_start.m_cur != this->members_.m_start.get_first());
|
2036
2495
|
}
|
2037
2496
|
|
2038
2497
|
inline T *priv_push_front_simple_pos() const
|
@@ -2043,7 +2502,8 @@ class deque : protected deque_base<typename real_allocator<T, Allocator>::type,
|
|
2043
2502
|
|
2044
2503
|
void priv_destroy_range(iterator p, iterator p2)
|
2045
2504
|
{
|
2046
|
-
|
2505
|
+
(void)p; (void)p2;
|
2506
|
+
BOOST_IF_CONSTEXPR(!Base::traits_t::trivial_dctr){
|
2047
2507
|
for(;p != p2; ++p){
|
2048
2508
|
allocator_traits_type::destroy(this->alloc(), boost::movelib::iterator_to_raw_pointer(p));
|
2049
2509
|
}
|
@@ -2052,7 +2512,8 @@ class deque : protected deque_base<typename real_allocator<T, Allocator>::type,
|
|
2052
2512
|
|
2053
2513
|
void priv_destroy_range(pointer p, pointer p2)
|
2054
2514
|
{
|
2055
|
-
|
2515
|
+
(void)p; (void)p2;
|
2516
|
+
BOOST_IF_CONSTEXPR(!Base::traits_t::trivial_dctr){
|
2056
2517
|
for(;p != p2; ++p){
|
2057
2518
|
allocator_traits_type::destroy(this->alloc(), boost::movelib::iterator_to_raw_pointer(p));
|
2058
2519
|
}
|
@@ -2060,84 +2521,117 @@ class deque : protected deque_base<typename real_allocator<T, Allocator>::type,
|
|
2060
2521
|
}
|
2061
2522
|
|
2062
2523
|
template<class InsertProxy>
|
2063
|
-
iterator
|
2524
|
+
iterator priv_insert_middle_aux_impl(const_iterator p, const size_type elemsbefore, const size_type length, const size_type n, InsertProxy proxy)
|
2064
2525
|
{
|
2065
|
-
|
2066
|
-
const size_type pos_n = size_type(p - this->cbegin());
|
2067
|
-
if(!this->members_.m_map){
|
2526
|
+
if (!this->members_.m_map) {
|
2068
2527
|
this->priv_initialize_map(0);
|
2069
|
-
|
2528
|
+
p = this->cbegin();
|
2070
2529
|
}
|
2071
2530
|
|
2072
|
-
|
2073
|
-
const size_type
|
2531
|
+
iterator pos(p.unconst());
|
2532
|
+
const size_type pos_n = size_type(p - this->cbegin());
|
2533
|
+
|
2074
2534
|
if (elemsbefore < length / 2) {
|
2075
2535
|
const iterator new_start = this->priv_reserve_elements_at_front(n);
|
2076
2536
|
const iterator old_start = this->members_.m_start;
|
2077
|
-
|
2078
|
-
|
2079
|
-
this->members_.m_start
|
2080
|
-
|
2081
|
-
else{
|
2082
|
-
pos = this->members_.m_start + difference_type(elemsbefore);
|
2083
|
-
if (elemsbefore >= n) {
|
2084
|
-
const iterator start_n = this->members_.m_start + difference_type(n);
|
2537
|
+
pos = this->members_.m_start + difference_type(elemsbefore);
|
2538
|
+
if (elemsbefore >= n) {
|
2539
|
+
const iterator start_n = this->members_.m_start + difference_type(n);
|
2540
|
+
BOOST_CONTAINER_TRY {
|
2085
2541
|
::boost::container::uninitialized_move_alloc
|
2086
2542
|
(this->alloc(), this->members_.m_start, start_n, new_start);
|
2087
|
-
this->members_.m_start = new_start;
|
2088
|
-
boost::container::move(start_n, pos, old_start);
|
2089
|
-
proxy.copy_n_and_update(this->alloc(), pos - difference_type(n), n);
|
2090
2543
|
}
|
2091
|
-
|
2092
|
-
|
2093
|
-
|
2544
|
+
BOOST_CONTAINER_CATCH(...) {
|
2545
|
+
this->priv_destroy_nodes(new_start.m_node, this->members_.m_start.m_node);
|
2546
|
+
BOOST_CONTAINER_RETHROW
|
2547
|
+
}
|
2548
|
+
BOOST_CONTAINER_CATCH_END
|
2549
|
+
this->members_.m_start = new_start;
|
2550
|
+
boost::container::move(start_n, pos, old_start);
|
2551
|
+
proxy.copy_n_and_update(this->alloc(), pos - difference_type(n), n);
|
2552
|
+
}
|
2553
|
+
else {
|
2554
|
+
const size_type mid_count = n - elemsbefore;
|
2555
|
+
const iterator mid_start = old_start - difference_type(mid_count);
|
2556
|
+
BOOST_CONTAINER_TRY {
|
2094
2557
|
proxy.uninitialized_copy_n_and_update(this->alloc(), mid_start, mid_count);
|
2095
2558
|
this->members_.m_start = mid_start;
|
2096
|
-
::boost::container::uninitialized_move_alloc
|
2097
|
-
|
2098
|
-
|
2099
|
-
|
2559
|
+
::boost::container::uninitialized_move_alloc(this->alloc(), old_start, pos, new_start);
|
2560
|
+
}
|
2561
|
+
BOOST_CONTAINER_CATCH(...) {
|
2562
|
+
this->priv_destroy_nodes(new_start.m_node, this->members_.m_start.m_node);
|
2563
|
+
BOOST_CONTAINER_RETHROW
|
2100
2564
|
}
|
2565
|
+
BOOST_CONTAINER_CATCH_END
|
2566
|
+
this->members_.m_start = new_start;
|
2567
|
+
proxy.copy_n_and_update(this->alloc(), old_start, elemsbefore);
|
2101
2568
|
}
|
2102
2569
|
}
|
2103
2570
|
else {
|
2104
2571
|
const iterator new_finish = this->priv_reserve_elements_at_back(n);
|
2105
2572
|
const iterator old_finish = this->members_.m_finish;
|
2106
2573
|
const size_type elemsafter = length - elemsbefore;
|
2107
|
-
|
2108
|
-
|
2574
|
+
|
2575
|
+
pos = old_finish - difference_type(elemsafter);
|
2576
|
+
if (elemsafter >= n) {
|
2577
|
+
iterator finish_n = old_finish - difference_type(n);
|
2578
|
+
BOOST_CONTAINER_TRY {
|
2579
|
+
::boost::container::uninitialized_move_alloc(this->alloc(), finish_n, old_finish, old_finish);
|
2580
|
+
}
|
2581
|
+
BOOST_CONTAINER_CATCH(...) {
|
2582
|
+
this->priv_destroy_nodes(this->members_.m_finish.m_node + 1, new_finish.m_node + 1);
|
2583
|
+
BOOST_CONTAINER_RETHROW
|
2584
|
+
}
|
2585
|
+
BOOST_CONTAINER_CATCH_END
|
2586
|
+
|
2109
2587
|
this->members_.m_finish = new_finish;
|
2588
|
+
boost::container::move_backward(pos, finish_n, old_finish);
|
2589
|
+
proxy.copy_n_and_update(this->alloc(), pos, n);
|
2110
2590
|
}
|
2111
|
-
else{
|
2112
|
-
|
2113
|
-
|
2114
|
-
iterator finish_n = old_finish - difference_type(n);
|
2115
|
-
::boost::container::uninitialized_move_alloc
|
2116
|
-
(this->alloc(), finish_n, old_finish, old_finish);
|
2117
|
-
this->members_.m_finish = new_finish;
|
2118
|
-
boost::container::move_backward(pos, finish_n, old_finish);
|
2119
|
-
proxy.copy_n_and_update(this->alloc(), pos, n);
|
2120
|
-
}
|
2121
|
-
else {
|
2122
|
-
const size_type raw_gap = n - elemsafter;
|
2591
|
+
else {
|
2592
|
+
const size_type raw_gap = n - elemsafter;
|
2593
|
+
BOOST_CONTAINER_TRY{
|
2123
2594
|
::boost::container::uninitialized_move_alloc
|
2124
2595
|
(this->alloc(), pos, old_finish, old_finish + difference_type(raw_gap));
|
2125
2596
|
BOOST_CONTAINER_TRY{
|
2126
2597
|
proxy.copy_n_and_update(this->alloc(), pos, elemsafter);
|
2127
2598
|
proxy.uninitialized_copy_n_and_update(this->alloc(), old_finish, raw_gap);
|
2128
2599
|
}
|
2129
|
-
BOOST_CONTAINER_CATCH(...){
|
2600
|
+
BOOST_CONTAINER_CATCH(...) {
|
2130
2601
|
this->priv_destroy_range(old_finish, old_finish + difference_type(elemsafter));
|
2131
2602
|
BOOST_CONTAINER_RETHROW
|
2132
2603
|
}
|
2133
2604
|
BOOST_CONTAINER_CATCH_END
|
2134
|
-
this->members_.m_finish = new_finish;
|
2135
2605
|
}
|
2606
|
+
BOOST_CONTAINER_CATCH(...) {
|
2607
|
+
this->priv_destroy_nodes(this->members_.m_finish.m_node + 1, new_finish.m_node + 1);
|
2608
|
+
BOOST_CONTAINER_RETHROW
|
2609
|
+
}
|
2610
|
+
BOOST_CONTAINER_CATCH_END
|
2611
|
+
this->members_.m_finish = new_finish;
|
2136
2612
|
}
|
2137
2613
|
}
|
2138
2614
|
return this->begin() + difference_type(pos_n);
|
2139
2615
|
}
|
2140
2616
|
|
2617
|
+
template<class InsertProxy>
|
2618
|
+
iterator priv_insert_aux_impl(const_iterator p, size_type n, InsertProxy proxy)
|
2619
|
+
{
|
2620
|
+
iterator pos(p.unconst());
|
2621
|
+
const size_type elemsbefore = static_cast<size_type>(pos - this->members_.m_start);
|
2622
|
+
const size_type length = this->size();
|
2623
|
+
|
2624
|
+
if (!elemsbefore) {
|
2625
|
+
return this->priv_insert_front_aux_impl(n, proxy);
|
2626
|
+
}
|
2627
|
+
else if (elemsbefore == length) {
|
2628
|
+
return this->priv_insert_back_aux_impl(n, proxy);
|
2629
|
+
}
|
2630
|
+
else {
|
2631
|
+
return this->priv_insert_middle_aux_impl(p, elemsbefore, length, n, proxy);
|
2632
|
+
}
|
2633
|
+
}
|
2634
|
+
|
2141
2635
|
template <class InsertProxy>
|
2142
2636
|
iterator priv_insert_back_aux_impl(size_type n, InsertProxy proxy)
|
2143
2637
|
{
|
@@ -2146,8 +2640,14 @@ class deque : protected deque_base<typename real_allocator<T, Allocator>::type,
|
|
2146
2640
|
}
|
2147
2641
|
|
2148
2642
|
iterator new_finish = this->priv_reserve_elements_at_back(n);
|
2149
|
-
|
2150
|
-
|
2643
|
+
BOOST_CONTAINER_TRY{
|
2644
|
+
proxy.uninitialized_copy_n_and_update(this->alloc(), this->members_.m_finish, n);
|
2645
|
+
}
|
2646
|
+
BOOST_CONTAINER_CATCH(...) {
|
2647
|
+
this->priv_destroy_nodes(this->members_.m_finish.m_node + 1, new_finish.m_node + 1);
|
2648
|
+
BOOST_CONTAINER_RETHROW
|
2649
|
+
}
|
2650
|
+
BOOST_CONTAINER_CATCH_END
|
2151
2651
|
this->members_.m_finish = new_finish;
|
2152
2652
|
return iterator(this->members_.m_finish - difference_type(n));
|
2153
2653
|
}
|
@@ -2160,7 +2660,15 @@ class deque : protected deque_base<typename real_allocator<T, Allocator>::type,
|
|
2160
2660
|
}
|
2161
2661
|
|
2162
2662
|
iterator new_start = this->priv_reserve_elements_at_front(n);
|
2163
|
-
|
2663
|
+
BOOST_CONTAINER_TRY{
|
2664
|
+
proxy.uninitialized_copy_n_and_update(this->alloc(), new_start, n);
|
2665
|
+
}
|
2666
|
+
BOOST_CONTAINER_CATCH(...) {
|
2667
|
+
this->priv_destroy_nodes(new_start.m_node, this->members_.m_start.m_node);
|
2668
|
+
BOOST_CONTAINER_RETHROW
|
2669
|
+
}
|
2670
|
+
BOOST_CONTAINER_CATCH_END
|
2671
|
+
|
2164
2672
|
this->members_.m_start = new_start;
|
2165
2673
|
return new_start;
|
2166
2674
|
}
|
@@ -2181,7 +2689,7 @@ class deque : protected deque_base<typename real_allocator<T, Allocator>::type,
|
|
2181
2689
|
(this->alloc(), *cur, *cur + get_block_ssize(), value);
|
2182
2690
|
}
|
2183
2691
|
boost::container::uninitialized_fill_alloc
|
2184
|
-
(this->alloc(), this->members_.m_finish.
|
2692
|
+
(this->alloc(), this->members_.m_finish.get_first(), this->members_.m_finish.m_cur, value);
|
2185
2693
|
}
|
2186
2694
|
BOOST_CONTAINER_CATCH(...){
|
2187
2695
|
this->priv_destroy_range(this->members_.m_start, iterator(*cur, cur, get_block_size()));
|
@@ -2220,7 +2728,7 @@ class deque : protected deque_base<typename real_allocator<T, Allocator>::type,
|
|
2220
2728
|
::boost::container::uninitialized_copy_alloc(this->alloc(), first, mid, *cur_node);
|
2221
2729
|
first = mid;
|
2222
2730
|
}
|
2223
|
-
::boost::container::uninitialized_copy_alloc(this->alloc(), first, last, this->members_.m_finish.
|
2731
|
+
::boost::container::uninitialized_copy_alloc(this->alloc(), first, last, this->members_.m_finish.get_first());
|
2224
2732
|
}
|
2225
2733
|
BOOST_CONTAINER_CATCH(...){
|
2226
2734
|
this->priv_destroy_range(this->members_.m_start, iterator(*cur_node, cur_node, get_block_size()));
|
@@ -2229,21 +2737,21 @@ class deque : protected deque_base<typename real_allocator<T, Allocator>::type,
|
|
2229
2737
|
BOOST_CONTAINER_CATCH_END
|
2230
2738
|
}
|
2231
2739
|
|
2232
|
-
// Called only if this->members_.m_finish.m_cur == this->members_.m_finish.
|
2740
|
+
// Called only if this->members_.m_finish.m_cur == this->members_.m_finish.get_first().
|
2233
2741
|
void priv_pop_back_aux() BOOST_NOEXCEPT_OR_NOTHROW
|
2234
2742
|
{
|
2235
|
-
this->priv_deallocate_node(this->members_.m_finish.
|
2743
|
+
this->priv_deallocate_node(this->members_.m_finish.get_first());
|
2236
2744
|
this->members_.m_finish.priv_set_node(this->members_.m_finish.m_node - 1, get_block_size());
|
2237
|
-
this->members_.m_finish.m_cur = this->members_.m_finish.
|
2745
|
+
this->members_.m_finish.m_cur = this->members_.m_finish.get_last() - 1;
|
2238
2746
|
allocator_traits_type::destroy
|
2239
2747
|
( this->alloc()
|
2240
2748
|
, boost::movelib::to_raw_pointer(this->members_.m_finish.m_cur)
|
2241
2749
|
);
|
2242
2750
|
}
|
2243
2751
|
|
2244
|
-
// Called only if this->members_.m_start.m_cur == this->members_.m_start.
|
2752
|
+
// Called only if this->members_.m_start.m_cur == this->members_.m_start.get_last() - 1. Note that
|
2245
2753
|
// if the deque has at least one element (a precondition for this member
|
2246
|
-
// function), and if this->members_.m_start.m_cur == this->members_.m_start.
|
2754
|
+
// function), and if this->members_.m_start.m_cur == this->members_.m_start.get_last(), then the deque
|
2247
2755
|
// must have at least two nodes.
|
2248
2756
|
void priv_pop_front_aux() BOOST_NOEXCEPT_OR_NOTHROW
|
2249
2757
|
{
|
@@ -2251,14 +2759,14 @@ class deque : protected deque_base<typename real_allocator<T, Allocator>::type,
|
|
2251
2759
|
( this->alloc()
|
2252
2760
|
, boost::movelib::to_raw_pointer(this->members_.m_start.m_cur)
|
2253
2761
|
);
|
2254
|
-
this->priv_deallocate_node(this->members_.m_start.
|
2762
|
+
this->priv_deallocate_node(this->members_.m_start.get_first());
|
2255
2763
|
this->members_.m_start.priv_set_node(this->members_.m_start.m_node + 1, get_block_size());
|
2256
|
-
this->members_.m_start.m_cur = this->members_.m_start.
|
2764
|
+
this->members_.m_start.m_cur = this->members_.m_start.get_first();
|
2257
2765
|
}
|
2258
2766
|
|
2259
2767
|
iterator priv_reserve_elements_at_front(size_type n)
|
2260
2768
|
{
|
2261
|
-
size_type vacancies = size_type(this->members_.m_start.m_cur - this->members_.m_start.
|
2769
|
+
size_type vacancies = size_type(this->members_.m_start.m_cur - this->members_.m_start.get_first());
|
2262
2770
|
if (n > vacancies){
|
2263
2771
|
size_type new_elems = n-vacancies;
|
2264
2772
|
size_type new_nodes = (new_elems + get_block_size() - 1u) / get_block_size();
|
@@ -2283,7 +2791,7 @@ class deque : protected deque_base<typename real_allocator<T, Allocator>::type,
|
|
2283
2791
|
|
2284
2792
|
iterator priv_reserve_elements_at_back(size_type n)
|
2285
2793
|
{
|
2286
|
-
size_type vacancies = size_type(this->members_.m_finish.
|
2794
|
+
size_type vacancies = size_type(this->members_.m_finish.get_last() - this->members_.m_finish.m_cur - 1);
|
2287
2795
|
if (n > vacancies){
|
2288
2796
|
size_type new_elems = size_type(n - vacancies);
|
2289
2797
|
size_type new_nodes = size_type(new_elems + get_block_size() - 1u)/get_block_size();
|
@@ -2348,7 +2856,8 @@ template <typename InputIterator, typename Allocator>
|
|
2348
2856
|
deque(InputIterator, InputIterator, Allocator const&) -> deque<typename iterator_traits<InputIterator>::value_type, Allocator>;
|
2349
2857
|
#endif
|
2350
2858
|
|
2351
|
-
}
|
2859
|
+
} //namespace container
|
2860
|
+
} //namespace boost
|
2352
2861
|
|
2353
2862
|
#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
|
2354
2863
|
|
@@ -2361,7 +2870,7 @@ struct has_trivial_destructor_after_move<boost::container::deque<T, Allocator, O
|
|
2361
2870
|
{
|
2362
2871
|
typedef typename boost::container::deque<T, Allocator, Options>::allocator_type allocator_type;
|
2363
2872
|
typedef typename ::boost::container::allocator_traits<allocator_type>::pointer pointer;
|
2364
|
-
|
2873
|
+
BOOST_STATIC_CONSTEXPR bool value = ::boost::has_trivial_destructor_after_move<allocator_type>::value &&
|
2365
2874
|
::boost::has_trivial_destructor_after_move<pointer>::value;
|
2366
2875
|
};
|
2367
2876
|
|