passenger 4.0.20 → 4.0.21
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of passenger might be problematic. Click here for more details.
- checksums.yaml +8 -8
- checksums.yaml.gz.asc +7 -7
- data.tar.gz.asc +7 -7
- data/.gitignore +1 -0
- data/.travis.yml +1 -1
- data/NEWS +15 -0
- data/README.md +5 -3
- data/Rakefile +1 -0
- data/bin/passenger-config +1 -5
- data/bin/passenger-install-apache2-module +53 -5
- data/bin/passenger-install-nginx-module +19 -6
- data/bin/passenger-memory-stats +3 -3
- data/build/agents.rb +11 -8
- data/build/apache2.rb +9 -5
- data/build/basics.rb +15 -21
- data/build/common_library.rb +16 -6
- data/build/cplusplus_support.rb +5 -5
- data/build/cxx_tests.rb +3 -3
- data/build/documentation.rb +1 -1
- data/build/misc.rb +4 -37
- data/build/node_tests.rb +29 -0
- data/build/oxt_tests.rb +1 -1
- data/build/packaging.rb +29 -10
- data/build/preprocessor.rb +2 -1
- data/build/test_basics.rb +15 -6
- data/debian.template/locations.ini.template +1 -0
- data/debian.template/passenger.install.template +1 -0
- data/dev/copy_boost_headers.rb +7 -3
- data/dev/run_travis.sh +32 -16
- data/doc/Users guide Apache.idmap.txt +22 -34
- data/doc/Users guide Apache.txt +20 -234
- data/doc/Users guide Nginx.idmap.txt +84 -66
- data/doc/Users guide Nginx.txt +50 -1
- data/doc/Users guide Standalone.idmap.txt +74 -0
- data/doc/Users guide Standalone.txt +22 -9
- data/doc/Users guide.txt +51 -0
- data/doc/users_guide_snippets/environment_variables.txt +0 -3
- data/doc/users_guide_snippets/installation.txt +337 -380
- data/doc/users_guide_snippets/installation/run_installer.txt +58 -0
- data/doc/users_guide_snippets/installation/verify_running_epilogue.txt +6 -0
- data/doc/users_guide_snippets/support_information.txt +2 -9
- data/doc/users_guide_snippets/troubleshooting/default.txt +112 -0
- data/doc/users_guide_snippets/troubleshooting/rails.txt +56 -0
- data/doc/users_guide_snippets/where_to_get_support.txt +9 -0
- data/ext/apache2/Bucket.h +1 -1
- data/ext/apache2/Configuration.hpp +0 -44
- data/ext/apache2/CreateDirConfig.cpp +1 -1
- data/ext/apache2/CreateDirConfig.cpp.erb +1 -1
- data/ext/apache2/Hooks.cpp +28 -21
- data/ext/apache2/MergeDirConfig.cpp +1 -0
- data/ext/apache2/MergeDirConfig.cpp.erb +1 -1
- data/ext/apache2/SetHeaders.cpp +73 -0
- data/ext/apache2/SetHeaders.cpp.erb +88 -0
- data/ext/boost/algorithm/string/detail/find_format.hpp +5 -5
- data/ext/boost/algorithm/string/detail/find_format_all.hpp +5 -5
- data/ext/boost/algorithm/string/detail/finder.hpp +1 -1
- data/ext/boost/algorithm/string/formatter.hpp +2 -2
- data/ext/boost/assert.hpp +6 -1
- data/ext/boost/atomic.hpp +18 -0
- data/ext/boost/atomic/atomic.hpp +241 -0
- data/ext/boost/atomic/detail/base.hpp +585 -0
- data/ext/boost/atomic/detail/cas32strong.hpp +885 -0
- data/ext/boost/atomic/detail/cas32weak.hpp +947 -0
- data/ext/boost/atomic/detail/cas64strong.hpp +443 -0
- data/ext/boost/atomic/detail/config.hpp +54 -0
- data/ext/boost/atomic/detail/gcc-alpha.hpp +368 -0
- data/ext/boost/atomic/detail/gcc-armv6plus.hpp +252 -0
- data/ext/boost/atomic/detail/gcc-cas.hpp +157 -0
- data/ext/boost/atomic/detail/gcc-ppc.hpp +2850 -0
- data/ext/boost/atomic/detail/gcc-sparcv9.hpp +1259 -0
- data/ext/boost/atomic/detail/gcc-x86.hpp +1766 -0
- data/ext/boost/atomic/detail/generic-cas.hpp +206 -0
- data/ext/boost/atomic/detail/interlocked.hpp +200 -0
- data/ext/boost/atomic/detail/linux-arm.hpp +189 -0
- data/ext/boost/atomic/detail/lockpool.hpp +97 -0
- data/ext/boost/atomic/detail/platform.hpp +62 -0
- data/ext/boost/atomic/detail/type-classification.hpp +45 -0
- data/ext/boost/chrono/config.hpp +8 -3
- data/ext/boost/chrono/duration.hpp +9 -10
- data/ext/boost/chrono/system_clocks.hpp +1 -1
- data/ext/boost/chrono/time_point.hpp +4 -3
- data/ext/boost/config/auto_link.hpp +53 -52
- data/ext/boost/config/compiler/borland.hpp +1 -0
- data/ext/boost/config/compiler/clang.hpp +24 -1
- data/ext/boost/config/compiler/codegear.hpp +1 -0
- data/ext/boost/config/compiler/common_edg.hpp +1 -0
- data/ext/boost/config/compiler/cray.hpp +1 -0
- data/ext/boost/config/compiler/digitalmars.hpp +1 -0
- data/ext/boost/config/compiler/gcc.hpp +29 -3
- data/ext/boost/config/compiler/gcc_xml.hpp +2 -1
- data/ext/boost/config/compiler/hp_acc.hpp +1 -0
- data/ext/boost/config/compiler/intel.hpp +1 -1
- data/ext/boost/config/compiler/metrowerks.hpp +1 -0
- data/ext/boost/config/compiler/mpw.hpp +1 -0
- data/ext/boost/config/compiler/pathscale.hpp +1 -0
- data/ext/boost/config/compiler/pgi.hpp +1 -0
- data/ext/boost/config/compiler/sunpro_cc.hpp +1 -0
- data/ext/boost/config/compiler/vacpp.hpp +3 -2
- data/ext/boost/config/compiler/visualc.hpp +25 -11
- data/ext/boost/config/platform/vxworks.hpp +353 -15
- data/ext/boost/config/select_compiler_config.hpp +4 -4
- data/ext/boost/config/stdlib/dinkumware.hpp +10 -3
- data/ext/boost/config/stdlib/libstdcpp3.hpp +2 -1
- data/ext/boost/config/suffix.hpp +45 -19
- data/ext/boost/date_time/format_date_parser.hpp +1 -11
- data/ext/boost/date_time/strings_from_facet.hpp +5 -3
- data/ext/boost/detail/atomic_redef_macros.hpp +19 -0
- data/ext/boost/detail/atomic_undef_macros.hpp +39 -0
- data/ext/boost/detail/endian.hpp +52 -4
- data/ext/boost/detail/scoped_enum_emulation.hpp +10 -10
- data/ext/boost/detail/select_type.hpp +36 -0
- data/ext/boost/exception/current_exception_cast.hpp +1 -1
- data/ext/boost/exception/detail/error_info_impl.hpp +3 -5
- data/ext/boost/exception/detail/exception_ptr.hpp +3 -3
- data/ext/boost/exception/detail/is_output_streamable.hpp +1 -1
- data/ext/boost/exception/detail/object_hex_dump.hpp +1 -1
- data/ext/boost/exception/detail/type_info.hpp +1 -1
- data/ext/boost/exception/diagnostic_information.hpp +15 -14
- data/ext/boost/exception/exception.hpp +1 -1
- data/ext/boost/exception/get_error_info.hpp +1 -1
- data/ext/boost/exception/info.hpp +12 -13
- data/ext/boost/exception/to_string.hpp +6 -1
- data/ext/boost/exception/to_string_stub.hpp +9 -1
- data/ext/boost/foreach.hpp +5 -5
- data/ext/boost/function/function_template.hpp +6 -6
- data/ext/boost/functional/hash/detail/float_functions.hpp +90 -0
- data/ext/boost/functional/hash/detail/hash_float.hpp +11 -2
- data/ext/boost/functional/hash/extensions.hpp +14 -2
- data/ext/boost/functional/hash/hash.hpp +26 -5
- data/ext/boost/get_pointer.hpp +17 -2
- data/ext/boost/integer_traits.hpp +1 -1
- data/ext/boost/lexical_cast.hpp +615 -395
- data/ext/boost/libs/atomic/lockpool.cpp +24 -0
- data/ext/boost/libs/system/src/error_code.cpp +25 -18
- data/ext/boost/libs/thread/src/future.cpp +7 -5
- data/ext/boost/libs/thread/src/pthread/once.cpp +9 -3
- data/ext/boost/libs/thread/src/pthread/once_atomic.cpp +90 -0
- data/ext/boost/libs/thread/src/pthread/thread.cpp +129 -95
- data/ext/boost/libs/thread/src/pthread/timeconv.inl +20 -1
- data/ext/boost/limits.hpp +1 -1
- data/ext/boost/math/policies/policy.hpp +10 -0
- data/ext/boost/math/special_functions/detail/round_fwd.hpp +17 -4
- data/ext/boost/math/special_functions/fpclassify.hpp +114 -45
- data/ext/boost/math/special_functions/math_fwd.hpp +195 -83
- data/ext/boost/math/special_functions/sign.hpp +13 -8
- data/ext/boost/math/tools/config.hpp +38 -16
- data/ext/boost/move/algorithm.hpp +275 -0
- data/ext/boost/move/core.hpp +332 -0
- data/ext/boost/move/detail/config_begin.hpp +23 -0
- data/ext/boost/move/detail/config_end.hpp +20 -0
- data/ext/boost/move/detail/meta_utils.hpp +158 -0
- data/ext/boost/move/iterator.hpp +298 -0
- data/ext/boost/move/move.hpp +10 -1256
- data/ext/boost/move/traits.hpp +142 -0
- data/ext/boost/move/utility.hpp +194 -0
- data/ext/boost/mpl/assert.hpp +72 -4
- data/ext/boost/noncopyable.hpp +15 -3
- data/ext/boost/pointer_to_other.hpp +55 -0
- data/ext/boost/range/concepts.hpp +4 -4
- data/ext/boost/range/detail/extract_optional_type.hpp +1 -1
- data/ext/boost/range/empty.hpp +1 -1
- data/ext/boost/range/iterator_range_core.hpp +4 -1
- data/ext/boost/range/iterator_range_io.hpp +2 -2
- data/ext/boost/ratio/config.hpp +6 -0
- data/ext/boost/ratio/detail/overflow_helpers.hpp +2 -2
- data/ext/boost/smart_ptr/allocate_shared_array.hpp +250 -0
- data/ext/boost/smart_ptr/detail/allocate_array_helper.hpp +169 -0
- data/ext/boost/smart_ptr/detail/array_deleter.hpp +124 -0
- data/ext/boost/smart_ptr/detail/array_traits.hpp +53 -0
- data/ext/boost/smart_ptr/detail/array_utility.hpp +178 -0
- data/ext/boost/smart_ptr/detail/make_array_helper.hpp +157 -0
- data/ext/boost/smart_ptr/detail/operator_bool.hpp +16 -9
- data/ext/boost/smart_ptr/detail/shared_count.hpp +78 -7
- data/ext/boost/smart_ptr/detail/sp_convertible.hpp +15 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +12 -6
- data/ext/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_aix.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_cw_x86.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_nt.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_pt.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp +162 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_solaris.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_spin.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_sync.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_impl.hpp +15 -0
- data/ext/boost/smart_ptr/detail/sp_forward.hpp +39 -0
- data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +19 -3
- data/ext/boost/smart_ptr/detail/sp_if_array.hpp +31 -0
- data/ext/boost/smart_ptr/detail/sp_nullptr_t.hpp +45 -0
- data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +5 -12
- data/ext/boost/smart_ptr/enable_shared_from_this.hpp +4 -4
- data/ext/boost/smart_ptr/make_shared.hpp +5 -1060
- data/ext/boost/smart_ptr/make_shared_array.hpp +247 -0
- data/ext/boost/smart_ptr/make_shared_object.hpp +1128 -0
- data/ext/boost/smart_ptr/scoped_array.hpp +32 -7
- data/ext/boost/smart_ptr/scoped_ptr.hpp +31 -5
- data/ext/boost/smart_ptr/shared_array.hpp +135 -20
- data/ext/boost/smart_ptr/shared_ptr.hpp +444 -126
- data/ext/boost/smart_ptr/weak_ptr.hpp +39 -28
- data/ext/boost/static_assert.hpp +74 -17
- data/ext/boost/system/error_code.hpp +76 -68
- data/ext/boost/system/system_error.hpp +5 -1
- data/ext/boost/thread/barrier.hpp +6 -2
- data/ext/boost/thread/completion_latch.hpp +233 -0
- data/ext/boost/thread/condition.hpp +6 -1
- data/ext/boost/thread/detail/async_func.hpp +571 -0
- data/ext/boost/thread/detail/config.hpp +248 -40
- data/ext/boost/thread/detail/counter.hpp +93 -0
- data/ext/boost/thread/detail/delete.hpp +12 -0
- data/ext/boost/thread/detail/invoke.hpp +1351 -0
- data/ext/boost/thread/detail/is_convertible.hpp +48 -0
- data/ext/boost/thread/detail/lockable_wrapper.hpp +45 -0
- data/ext/boost/thread/detail/log.hpp +83 -0
- data/ext/boost/thread/detail/make_tuple_indices.hpp +224 -0
- data/ext/boost/thread/detail/move.hpp +32 -16
- data/ext/boost/thread/detail/thread.hpp +236 -41
- data/ext/boost/thread/detail/thread_group.hpp +55 -9
- data/ext/boost/thread/detail/thread_interruption.hpp +4 -1
- data/ext/boost/thread/exceptions.hpp +2 -0
- data/ext/boost/thread/externally_locked.hpp +351 -0
- data/ext/boost/thread/externally_locked_stream.hpp +170 -0
- data/ext/boost/thread/future.hpp +2517 -455
- data/ext/boost/thread/future_error_code.hpp +61 -0
- data/ext/boost/thread/is_locked_by_this_thread.hpp +39 -0
- data/ext/boost/thread/latch.hpp +142 -0
- data/ext/boost/thread/lock_algorithms.hpp +468 -0
- data/ext/boost/thread/lock_concepts.hpp +197 -0
- data/ext/boost/thread/lock_factories.hpp +78 -0
- data/ext/boost/thread/lock_guard.hpp +88 -0
- data/ext/boost/thread/lock_options.hpp +31 -0
- data/ext/boost/thread/lock_traits.hpp +45 -0
- data/ext/boost/thread/lock_types.hpp +1226 -0
- data/ext/boost/thread/lockable_adapter.hpp +226 -0
- data/ext/boost/thread/lockable_concepts.hpp +157 -0
- data/ext/boost/thread/lockable_traits.hpp +207 -0
- data/ext/boost/thread/locks.hpp +5 -1816
- data/ext/boost/thread/mutex.hpp +33 -1
- data/ext/boost/thread/null_mutex.hpp +243 -0
- data/ext/boost/thread/once.hpp +10 -1
- data/ext/boost/thread/poly_lockable.hpp +68 -0
- data/ext/boost/thread/poly_lockable_adapter.hpp +89 -0
- data/ext/boost/thread/poly_shared_lockable.hpp +135 -0
- data/ext/boost/thread/poly_shared_lockable_adapter.hpp +170 -0
- data/ext/boost/thread/pthread/condition_variable.hpp +74 -26
- data/ext/boost/thread/pthread/condition_variable_fwd.hpp +54 -27
- data/ext/boost/thread/pthread/mutex.hpp +101 -38
- data/ext/boost/thread/pthread/once.hpp +459 -44
- data/ext/boost/thread/pthread/once_atomic.hpp +313 -0
- data/ext/boost/thread/pthread/recursive_mutex.hpp +19 -10
- data/ext/boost/thread/pthread/shared_mutex.hpp +226 -61
- data/ext/boost/thread/pthread/shared_mutex_assert.hpp +724 -0
- data/ext/boost/thread/pthread/thread_data.hpp +53 -50
- data/ext/boost/thread/pthread/timespec.hpp +96 -12
- data/ext/boost/thread/recursive_mutex.hpp +44 -1
- data/ext/boost/thread/reverse_lock.hpp +3 -2
- data/ext/boost/thread/scoped_thread.hpp +285 -0
- data/ext/boost/thread/shared_lock_guard.hpp +2 -1
- data/ext/boost/thread/shared_mutex.hpp +23 -0
- data/ext/boost/thread/strict_lock.hpp +235 -0
- data/ext/boost/thread/sync_bounded_queue.hpp +594 -0
- data/ext/boost/thread/sync_queue.hpp +516 -0
- data/ext/boost/thread/synchronized_value.hpp +1001 -0
- data/ext/boost/thread/testable_mutex.hpp +148 -0
- data/ext/boost/thread/thread.hpp +1 -13
- data/ext/boost/thread/thread_functors.hpp +57 -0
- data/ext/boost/thread/thread_guard.hpp +46 -0
- data/ext/boost/thread/thread_only.hpp +29 -0
- data/ext/boost/thread/v2/shared_mutex.hpp +1062 -0
- data/ext/boost/thread/v2/thread.hpp +37 -10
- data/ext/boost/thread/xtime.hpp +2 -1
- data/ext/boost/token_functions.hpp +16 -16
- data/ext/boost/type_traits/add_lvalue_reference.hpp +26 -0
- data/ext/boost/type_traits/add_reference.hpp +1 -1
- data/ext/boost/type_traits/add_rvalue_reference.hpp +4 -4
- data/ext/boost/type_traits/aligned_storage.hpp +13 -0
- data/ext/boost/type_traits/common_type.hpp +11 -12
- data/ext/boost/type_traits/config.hpp +1 -1
- data/ext/boost/type_traits/detail/common_type_imp.hpp +1 -1
- data/ext/boost/type_traits/detail/has_binary_operator.hpp +1 -1
- data/ext/boost/type_traits/detail/is_function_ptr_tester.hpp +1 -1
- data/ext/boost/type_traits/has_left_shift.hpp +49 -0
- data/ext/boost/type_traits/has_right_shift.hpp +49 -0
- data/ext/boost/type_traits/has_trivial_move_assign.hpp +57 -0
- data/ext/boost/type_traits/has_trivial_move_constructor.hpp +57 -0
- data/ext/boost/type_traits/intrinsics.hpp +18 -2
- data/ext/boost/type_traits/is_abstract.hpp +1 -1
- data/ext/boost/type_traits/is_array.hpp +1 -1
- data/ext/boost/type_traits/is_const.hpp +1 -1
- data/ext/boost/type_traits/is_convertible.hpp +78 -17
- data/ext/boost/type_traits/is_function.hpp +6 -1
- data/ext/boost/type_traits/is_integral.hpp +6 -1
- data/ext/boost/type_traits/is_nothrow_move_assignable.hpp +84 -0
- data/ext/boost/type_traits/is_nothrow_move_constructible.hpp +84 -0
- data/ext/boost/type_traits/is_pod.hpp +3 -1
- data/ext/boost/type_traits/is_rvalue_reference.hpp +1 -1
- data/ext/boost/type_traits/is_volatile.hpp +1 -1
- data/ext/boost/type_traits/make_signed.hpp +153 -0
- data/ext/boost/type_traits/make_unsigned.hpp +16 -0
- data/ext/boost/type_traits/remove_const.hpp +1 -1
- data/ext/boost/type_traits/remove_cv.hpp +1 -1
- data/ext/boost/type_traits/remove_reference.hpp +1 -1
- data/ext/boost/type_traits/remove_volatile.hpp +1 -1
- data/ext/boost/unordered/detail/allocate.hpp +1120 -0
- data/ext/boost/unordered/detail/buckets.hpp +876 -0
- data/ext/boost/unordered/detail/equivalent.hpp +680 -0
- data/ext/boost/unordered/detail/extract_key.hpp +183 -0
- data/ext/boost/unordered/detail/fwd.hpp +23 -0
- data/ext/boost/unordered/detail/table.hpp +861 -0
- data/ext/boost/unordered/detail/unique.hpp +622 -0
- data/ext/boost/unordered/detail/util.hpp +260 -0
- data/ext/boost/unordered/unordered_map.hpp +1652 -0
- data/ext/boost/unordered/unordered_map_fwd.hpp +65 -0
- data/ext/boost/unordered/unordered_set.hpp +1549 -0
- data/ext/boost/unordered/unordered_set_fwd.hpp +63 -0
- data/ext/boost/unordered_map.hpp +18 -0
- data/ext/boost/unordered_set.hpp +18 -0
- data/ext/boost/utility/addressof.hpp +2 -2
- data/ext/boost/utility/result_of.hpp +8 -1
- data/ext/boost/version.hpp +2 -2
- data/ext/common/Account.h +1 -1
- data/ext/common/AccountsDatabase.h +1 -1
- data/ext/common/AgentsStarter.cpp +3 -1
- data/ext/common/AgentsStarter.h +2 -2
- data/ext/common/ApplicationPool2/AppTypes.cpp +24 -6
- data/ext/common/ApplicationPool2/AppTypes.h +17 -8
- data/ext/common/ApplicationPool2/Common.h +12 -12
- data/ext/common/ApplicationPool2/DirectSpawner.h +2 -2
- data/ext/common/ApplicationPool2/DummySpawner.h +3 -3
- data/ext/common/ApplicationPool2/Group.h +6 -6
- data/ext/common/ApplicationPool2/Implementation.cpp +19 -19
- data/ext/common/ApplicationPool2/PipeWatcher.h +5 -5
- data/ext/common/ApplicationPool2/Pool.h +21 -21
- data/ext/common/ApplicationPool2/Process.h +6 -6
- data/ext/common/ApplicationPool2/Session.h +1 -1
- data/ext/common/ApplicationPool2/SmartSpawner.h +24 -12
- data/ext/common/ApplicationPool2/Socket.h +2 -2
- data/ext/common/ApplicationPool2/Spawner.h +64 -14
- data/ext/common/ApplicationPool2/SpawnerFactory.h +7 -7
- data/ext/common/ApplicationPool2/SuperGroup.h +5 -5
- data/ext/common/BackgroundEventLoop.cpp +4 -4
- data/ext/common/BackgroundEventLoop.h +1 -1
- data/ext/common/Constants.h +13 -1
- data/ext/common/EventedBufferedInput.h +8 -8
- data/ext/common/Exceptions.cpp +71 -0
- data/ext/common/Exceptions.h +60 -7
- data/ext/common/FileDescriptor.h +4 -4
- data/ext/common/MessageClient.h +1 -1
- data/ext/common/MessageServer.h +5 -5
- data/ext/common/MultiLibeio.cpp +3 -3
- data/ext/common/MultiLibeio.h +2 -2
- data/ext/common/RandomGenerator.h +11 -11
- data/ext/common/ResourceLocator.h +8 -1
- data/ext/common/SafeLibev.h +12 -12
- data/ext/common/ServerInstanceDir.h +11 -3
- data/ext/common/UnionStation.h +10 -10
- data/ext/common/Utils.cpp +11 -13
- data/ext/common/Utils.h +9 -9
- data/ext/common/Utils/BlockingQueue.h +10 -10
- data/ext/common/Utils/BufferedIO.h +1 -1
- data/ext/common/Utils/CachedFileStat.hpp +2 -2
- data/ext/common/Utils/FileChangeChecker.h +1 -1
- data/ext/common/Utils/HashMap.h +13 -4
- data/ext/common/Utils/IOUtils.cpp +33 -10
- data/ext/common/Utils/IniFile.h +3 -3
- data/ext/common/Utils/Lock.h +2 -2
- data/ext/common/Utils/MessagePassing.h +10 -10
- data/ext/common/Utils/ProcessMetricsCollector.h +24 -6
- data/ext/common/Utils/ScopeGuard.h +5 -5
- data/ext/common/Utils/jsoncpp.cpp +2 -0
- data/ext/common/agents/HelperAgent/FileBackedPipe.h +26 -26
- data/ext/common/agents/HelperAgent/Main.cpp +18 -18
- data/ext/common/agents/HelperAgent/RequestHandler.cpp +4 -4
- data/ext/common/agents/HelperAgent/RequestHandler.h +30 -21
- data/ext/common/agents/LoggingAgent/AdminController.h +1 -1
- data/ext/common/agents/LoggingAgent/FilterSupport.h +13 -11
- data/ext/common/agents/LoggingAgent/LoggingServer.h +11 -11
- data/ext/common/agents/LoggingAgent/Main.cpp +9 -9
- data/ext/common/agents/LoggingAgent/RemoteSender.h +3 -3
- data/ext/common/agents/SpawnPreparer.cpp +1 -0
- data/ext/common/agents/Watchdog/AgentWatcher.cpp +8 -7
- data/ext/common/agents/Watchdog/Main.cpp +81 -73
- data/ext/common/agents/Watchdog/ServerInstanceDirToucher.cpp +1 -1
- data/ext/libev/Changes +57 -0
- data/ext/libev/LICENSE +2 -1
- data/ext/libev/Makefile.in +110 -50
- data/ext/libev/README +8 -8
- data/ext/libev/aclocal.m4 +1503 -861
- data/ext/libev/config.guess +290 -304
- data/ext/libev/config.sub +77 -198
- data/ext/libev/configure +1735 -890
- data/ext/libev/configure.ac +3 -2
- data/ext/libev/ev++.h +6 -6
- data/ext/libev/ev.c +541 -214
- data/ext/libev/ev.h +106 -100
- data/ext/libev/ev_epoll.c +1 -1
- data/ext/libev/ev_kqueue.c +20 -4
- data/ext/libev/ev_vars.h +15 -16
- data/ext/libev/ev_win32.c +12 -2
- data/ext/libev/ev_wrap.h +162 -160
- data/ext/libev/event.c +29 -6
- data/ext/libev/event.h +9 -2
- data/ext/libev/ltmain.sh +2632 -1384
- data/ext/nginx/ConfigurationCommands.c +1 -1
- data/ext/nginx/ConfigurationCommands.c.erb +3 -1
- data/ext/nginx/ContentHandler.c +25 -2
- data/ext/nginx/CreateLocationConfig.c +1 -0
- data/ext/nginx/CreateLocationConfig.c.erb +1 -1
- data/ext/nginx/MergeLocationConfig.c +1 -0
- data/ext/nginx/MergeLocationConfig.c.erb +1 -1
- data/ext/nginx/config +12 -0
- data/ext/oxt/dynamic_thread_group.hpp +7 -4
- data/ext/oxt/system_calls.cpp +5 -1
- data/ext/oxt/system_calls.hpp +3 -0
- data/helper-scripts/node-loader.js +117 -249
- data/lib/phusion_passenger.rb +27 -5
- data/lib/phusion_passenger/abstract_installer.rb +104 -9
- data/lib/phusion_passenger/admin_tools/memory_stats.rb +10 -9
- data/lib/phusion_passenger/apache2/config_options.rb +6 -3
- data/lib/phusion_passenger/common_library.rb +7 -1
- data/lib/phusion_passenger/constants.rb +6 -0
- data/lib/phusion_passenger/loader_shared_helpers.rb +7 -4
- data/lib/phusion_passenger/nginx/config_options.rb +2 -1
- data/lib/phusion_passenger/packaging.rb +3 -0
- data/lib/phusion_passenger/platform_info/apache.rb +43 -6
- data/lib/phusion_passenger/platform_info/apache_detector.rb +15 -5
- data/lib/phusion_passenger/platform_info/compiler.rb +167 -32
- data/lib/phusion_passenger/platform_info/cxx_portability.rb +133 -77
- data/lib/phusion_passenger/platform_info/depcheck.rb +17 -7
- data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +3 -3
- data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
- data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -6
- data/lib/phusion_passenger/platform_info/linux.rb +2 -1
- data/lib/phusion_passenger/platform_info/operating_system.rb +1 -1
- data/lib/phusion_passenger/platform_info/ruby.rb +18 -3
- data/lib/phusion_passenger/standalone/runtime_installer.rb +6 -2
- data/lib/phusion_passenger/standalone/start_command.rb +8 -2
- data/lib/phusion_passenger/utils/ansi_colors.rb +9 -0
- data/lib/phusion_passenger/utils/hosts_file_parser.rb +4 -2
- data/node_lib/phusion_passenger/httplib_emulation.js +141 -0
- data/node_lib/phusion_passenger/line_reader.js +154 -0
- data/node_lib/phusion_passenger/request_handler.js +65 -0
- data/node_lib/phusion_passenger/session_protocol_parser.js +113 -0
- data/resources/templates/apache2/deployment_example.txt.erb +2 -1
- data/resources/templates/apache2/installing_against_a_different_apache.txt.erb +14 -0
- data/resources/templates/apache2/multiple_apache_installations_detected.txt.erb +15 -0
- data/resources/templates/apache2/possible_solutions_for_compilation_and_installation_problems.txt.erb +4 -5
- data/resources/templates/general_error_with_html.html.template +1 -1
- data/resources/templates/installer_common/gem_install_permission_problems.txt.erb +17 -0
- data/resources/templates/installer_common/low_amount_of_memory_warning.txt.erb +6 -4
- data/resources/templates/installer_common/world_inaccessible_directories.txt.erb +16 -0
- data/resources/templates/nginx/deployment_example.txt.erb +2 -1
- data/resources/templates/nginx/possible_solutions_for_compilation_and_installation_problems.txt.erb +4 -5
- data/resources/templates/standalone/config.erb +1 -0
- data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +3 -3
- data/test/cxx/ApplicationPool2/PoolTest.cpp +4 -4
- data/test/cxx/ApplicationPool2/ProcessTest.cpp +5 -5
- data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +5 -5
- data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +1 -1
- data/test/cxx/EventedBufferedInputTest.cpp +6 -6
- data/test/cxx/FileBackedPipeTest.cpp +1 -1
- data/test/cxx/MessagePassingTest.cpp +1 -1
- data/test/cxx/MessageServerTest.cpp +4 -4
- data/test/cxx/RequestHandlerTest.cpp +7 -7
- data/test/cxx/UnionStationTest.cpp +2 -2
- data/test/node/line_reader_spec.js +338 -0
- data/test/node/spec_helper.js +27 -0
- data/test/ruby/standalone/runtime_installer_spec.rb +2 -1
- metadata +131 -22
- metadata.gz.asc +7 -7
- data/ext/boost/functional/hash/detail/container_fwd_0x.hpp +0 -29
- data/ext/boost/lambda/core.hpp +0 -79
- data/ext/boost/lambda/detail/actions.hpp +0 -174
- data/ext/boost/lambda/detail/arity_code.hpp +0 -110
- data/ext/boost/lambda/detail/function_adaptors.hpp +0 -789
- data/ext/boost/lambda/detail/is_instance_of.hpp +0 -104
- data/ext/boost/lambda/detail/lambda_config.hpp +0 -48
- data/ext/boost/lambda/detail/lambda_functor_base.hpp +0 -615
- data/ext/boost/lambda/detail/lambda_functors.hpp +0 -324
- data/ext/boost/lambda/detail/lambda_fwd.hpp +0 -74
- data/ext/boost/lambda/detail/lambda_traits.hpp +0 -578
- data/ext/boost/lambda/detail/member_ptr.hpp +0 -737
- data/ext/boost/lambda/detail/operator_actions.hpp +0 -139
- data/ext/boost/lambda/detail/operator_lambda_func_base.hpp +0 -271
- data/ext/boost/lambda/detail/operator_return_type_traits.hpp +0 -917
- data/ext/boost/lambda/detail/operators.hpp +0 -370
- data/ext/boost/lambda/detail/ret.hpp +0 -325
- data/ext/boost/lambda/detail/return_type_traits.hpp +0 -282
- data/ext/boost/lambda/detail/select_functions.hpp +0 -74
- data/ext/boost/lambda/lambda.hpp +0 -34
@@ -57,7 +57,7 @@ struct remove_volatile_impl
|
|
57
57
|
// We can't filter out rvalue_references at the same level as
|
58
58
|
// references or we get ambiguities from msvc:
|
59
59
|
//
|
60
|
-
#ifndef
|
60
|
+
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
|
61
61
|
template <typename T>
|
62
62
|
struct remove_volatile_impl<T&&>
|
63
63
|
{
|
@@ -0,0 +1,1120 @@
|
|
1
|
+
|
2
|
+
// Copyright 2005-2011 Daniel James.
|
3
|
+
// Copyright 2009 Pablo Halpern.
|
4
|
+
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
5
|
+
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
6
|
+
|
7
|
+
// See http://www.boost.org/libs/unordered for documentation
|
8
|
+
|
9
|
+
#ifndef BOOST_UNORDERED_ALLOCATE_HPP
|
10
|
+
#define BOOST_UNORDERED_ALLOCATE_HPP
|
11
|
+
|
12
|
+
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
13
|
+
# pragma once
|
14
|
+
#endif
|
15
|
+
|
16
|
+
#include <boost/unordered/detail/fwd.hpp>
|
17
|
+
#include <boost/move/move.hpp>
|
18
|
+
#include <boost/preprocessor/cat.hpp>
|
19
|
+
#include <boost/preprocessor/inc.hpp>
|
20
|
+
#include <boost/preprocessor/dec.hpp>
|
21
|
+
#include <boost/preprocessor/repetition/enum.hpp>
|
22
|
+
#include <boost/preprocessor/repetition/enum_params.hpp>
|
23
|
+
#include <boost/preprocessor/repetition/enum_binary_params.hpp>
|
24
|
+
#include <boost/preprocessor/repetition/repeat_from_to.hpp>
|
25
|
+
#include <boost/type_traits/is_class.hpp>
|
26
|
+
#include <boost/type_traits/add_lvalue_reference.hpp>
|
27
|
+
#include <boost/tuple/tuple.hpp>
|
28
|
+
#include <boost/utility/enable_if.hpp>
|
29
|
+
#include <boost/utility/addressof.hpp>
|
30
|
+
#include <boost/detail/select_type.hpp>
|
31
|
+
#include <boost/assert.hpp>
|
32
|
+
#include <utility>
|
33
|
+
|
34
|
+
#if !defined(BOOST_NO_CXX11_HDR_TUPLE)
|
35
|
+
#include <tuple>
|
36
|
+
#endif
|
37
|
+
|
38
|
+
#if defined(BOOST_MSVC)
|
39
|
+
#pragma warning(push)
|
40
|
+
#pragma warning(disable:4512) // assignment operator could not be generated.
|
41
|
+
#pragma warning(disable:4345) // behavior change: an object of POD type
|
42
|
+
// constructed with an initializer of the form ()
|
43
|
+
// will be default-initialized.
|
44
|
+
#endif
|
45
|
+
|
46
|
+
#define BOOST_UNORDERED_EMPLACE_LIMIT 10
|
47
|
+
|
48
|
+
namespace boost { namespace unordered { namespace detail {
|
49
|
+
|
50
|
+
////////////////////////////////////////////////////////////////////////////
|
51
|
+
// Bits and pieces for implementing traits
|
52
|
+
|
53
|
+
template <typename T> typename boost::add_lvalue_reference<T>::type make();
|
54
|
+
struct choice9 { typedef char (&type)[9]; };
|
55
|
+
struct choice8 : choice9 { typedef char (&type)[8]; };
|
56
|
+
struct choice7 : choice8 { typedef char (&type)[7]; };
|
57
|
+
struct choice6 : choice7 { typedef char (&type)[6]; };
|
58
|
+
struct choice5 : choice6 { typedef char (&type)[5]; };
|
59
|
+
struct choice4 : choice5 { typedef char (&type)[4]; };
|
60
|
+
struct choice3 : choice4 { typedef char (&type)[3]; };
|
61
|
+
struct choice2 : choice3 { typedef char (&type)[2]; };
|
62
|
+
struct choice1 : choice2 { typedef char (&type)[1]; };
|
63
|
+
choice1 choose();
|
64
|
+
|
65
|
+
typedef choice1::type yes_type;
|
66
|
+
typedef choice2::type no_type;
|
67
|
+
|
68
|
+
struct private_type
|
69
|
+
{
|
70
|
+
private_type const &operator,(int) const;
|
71
|
+
};
|
72
|
+
|
73
|
+
template <typename T>
|
74
|
+
no_type is_private_type(T const&);
|
75
|
+
yes_type is_private_type(private_type const&);
|
76
|
+
|
77
|
+
struct convert_from_anything {
|
78
|
+
template <typename T>
|
79
|
+
convert_from_anything(T const&);
|
80
|
+
};
|
81
|
+
|
82
|
+
////////////////////////////////////////////////////////////////////////////
|
83
|
+
// emplace_args
|
84
|
+
//
|
85
|
+
// Either forwarding variadic arguments, or storing the arguments in
|
86
|
+
// emplace_args##n
|
87
|
+
|
88
|
+
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
89
|
+
|
90
|
+
#define BOOST_UNORDERED_EMPLACE_TEMPLATE typename... Args
|
91
|
+
#define BOOST_UNORDERED_EMPLACE_ARGS BOOST_FWD_REF(Args)... args
|
92
|
+
#define BOOST_UNORDERED_EMPLACE_FORWARD boost::forward<Args>(args)...
|
93
|
+
|
94
|
+
#define BOOST_UNORDERED_EMPLACE_ARGS1(a0) a0
|
95
|
+
#define BOOST_UNORDERED_EMPLACE_ARGS2(a0, a1) a0, a1
|
96
|
+
#define BOOST_UNORDERED_EMPLACE_ARGS3(a0, a1, a2) a0, a1, a2
|
97
|
+
|
98
|
+
#else
|
99
|
+
|
100
|
+
#define BOOST_UNORDERED_EMPLACE_TEMPLATE typename Args
|
101
|
+
#define BOOST_UNORDERED_EMPLACE_ARGS Args const& args
|
102
|
+
#define BOOST_UNORDERED_EMPLACE_FORWARD args
|
103
|
+
|
104
|
+
#define BOOST_UNORDERED_FWD_PARAM(z, n, a) \
|
105
|
+
BOOST_FWD_REF(BOOST_PP_CAT(A, n)) BOOST_PP_CAT(a, n)
|
106
|
+
|
107
|
+
#define BOOST_UNORDERED_CALL_FORWARD(z, i, a) \
|
108
|
+
boost::forward<BOOST_PP_CAT(A,i)>(BOOST_PP_CAT(a,i))
|
109
|
+
|
110
|
+
#define BOOST_UNORDERED_EARGS(z, n, _) \
|
111
|
+
template <BOOST_PP_ENUM_PARAMS_Z(z, n, typename A)> \
|
112
|
+
struct BOOST_PP_CAT(emplace_args, n) \
|
113
|
+
{ \
|
114
|
+
BOOST_PP_REPEAT_##z(n, BOOST_UNORDERED_EARGS_MEMBER, _) \
|
115
|
+
BOOST_PP_CAT(emplace_args, n) ( \
|
116
|
+
BOOST_PP_ENUM_BINARY_PARAMS_Z(z, n, Arg, b) \
|
117
|
+
) : BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_EARGS_INIT, _) \
|
118
|
+
{} \
|
119
|
+
\
|
120
|
+
}; \
|
121
|
+
\
|
122
|
+
template <BOOST_PP_ENUM_PARAMS_Z(z, n, typename A)> \
|
123
|
+
inline BOOST_PP_CAT(emplace_args, n) < \
|
124
|
+
BOOST_PP_ENUM_PARAMS_Z(z, n, A) \
|
125
|
+
> create_emplace_args( \
|
126
|
+
BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_FWD_PARAM, b) \
|
127
|
+
) \
|
128
|
+
{ \
|
129
|
+
BOOST_PP_CAT(emplace_args, n) < \
|
130
|
+
BOOST_PP_ENUM_PARAMS_Z(z, n, A) \
|
131
|
+
> e(BOOST_PP_ENUM_PARAMS_Z(z, n, b)); \
|
132
|
+
return e; \
|
133
|
+
}
|
134
|
+
|
135
|
+
#define BOOST_UNORDERED_EMPLACE_ARGS1 create_emplace_args
|
136
|
+
#define BOOST_UNORDERED_EMPLACE_ARGS2 create_emplace_args
|
137
|
+
#define BOOST_UNORDERED_EMPLACE_ARGS3 create_emplace_args
|
138
|
+
|
139
|
+
#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
140
|
+
|
141
|
+
#define BOOST_UNORDERED_EARGS_MEMBER(z, n, _) \
|
142
|
+
typedef BOOST_FWD_REF(BOOST_PP_CAT(A, n)) BOOST_PP_CAT(Arg, n); \
|
143
|
+
BOOST_PP_CAT(Arg, n) BOOST_PP_CAT(a, n);
|
144
|
+
|
145
|
+
#define BOOST_UNORDERED_EARGS_INIT(z, n, _) \
|
146
|
+
BOOST_PP_CAT(a, n)( \
|
147
|
+
boost::forward<BOOST_PP_CAT(A,n)>(BOOST_PP_CAT(b, n)))
|
148
|
+
|
149
|
+
#else
|
150
|
+
|
151
|
+
#define BOOST_UNORDERED_EARGS_MEMBER(z, n, _) \
|
152
|
+
typedef typename boost::add_lvalue_reference<BOOST_PP_CAT(A, n)>::type \
|
153
|
+
BOOST_PP_CAT(Arg, n); \
|
154
|
+
BOOST_PP_CAT(Arg, n) BOOST_PP_CAT(a, n);
|
155
|
+
|
156
|
+
#define BOOST_UNORDERED_EARGS_INIT(z, n, _) \
|
157
|
+
BOOST_PP_CAT(a, n)(BOOST_PP_CAT(b, n))
|
158
|
+
|
159
|
+
#endif
|
160
|
+
|
161
|
+
BOOST_PP_REPEAT_FROM_TO(1, BOOST_UNORDERED_EMPLACE_LIMIT, BOOST_UNORDERED_EARGS,
|
162
|
+
_)
|
163
|
+
|
164
|
+
#undef BOOST_UNORDERED_DEFINE_EMPLACE_ARGS
|
165
|
+
#undef BOOST_UNORDERED_EARGS_MEMBER
|
166
|
+
#undef BOOST_UNORDERED_EARGS_INIT
|
167
|
+
|
168
|
+
#endif
|
169
|
+
|
170
|
+
}}}
|
171
|
+
|
172
|
+
////////////////////////////////////////////////////////////////////////////////
|
173
|
+
//
|
174
|
+
// Pick which version of allocator_traits to use
|
175
|
+
//
|
176
|
+
// 0 = Own partial implementation
|
177
|
+
// 1 = std::allocator_traits
|
178
|
+
// 2 = boost::container::allocator_traits
|
179
|
+
|
180
|
+
#if !defined(BOOST_UNORDERED_USE_ALLOCATOR_TRAITS)
|
181
|
+
# if defined(__GXX_EXPERIMENTAL_CXX0X__) && \
|
182
|
+
(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))
|
183
|
+
# define BOOST_UNORDERED_USE_ALLOCATOR_TRAITS 0
|
184
|
+
# elif defined(BOOST_MSVC)
|
185
|
+
# if BOOST_MSVC < 1400
|
186
|
+
// Use container's allocator_traits for older versions of Visual
|
187
|
+
// C++ as I don't test with them.
|
188
|
+
# define BOOST_UNORDERED_USE_ALLOCATOR_TRAITS 2
|
189
|
+
# endif
|
190
|
+
# endif
|
191
|
+
#endif
|
192
|
+
|
193
|
+
#if !defined(BOOST_UNORDERED_USE_ALLOCATOR_TRAITS)
|
194
|
+
# define BOOST_UNORDERED_USE_ALLOCATOR_TRAITS 0
|
195
|
+
#endif
|
196
|
+
|
197
|
+
////////////////////////////////////////////////////////////////////////////////
|
198
|
+
//
|
199
|
+
// Some utilities for implementing allocator_traits, but useful elsewhere so
|
200
|
+
// they're always defined.
|
201
|
+
|
202
|
+
#if !defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS)
|
203
|
+
# include <type_traits>
|
204
|
+
#endif
|
205
|
+
|
206
|
+
namespace boost { namespace unordered { namespace detail {
|
207
|
+
|
208
|
+
////////////////////////////////////////////////////////////////////////////
|
209
|
+
// Integral_constrant, true_type, false_type
|
210
|
+
//
|
211
|
+
// Uses the standard versions if available.
|
212
|
+
|
213
|
+
#if !defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS)
|
214
|
+
|
215
|
+
using std::integral_constant;
|
216
|
+
using std::true_type;
|
217
|
+
using std::false_type;
|
218
|
+
|
219
|
+
#else
|
220
|
+
|
221
|
+
template <typename T, T Value>
|
222
|
+
struct integral_constant { enum { value = Value }; };
|
223
|
+
|
224
|
+
typedef boost::unordered::detail::integral_constant<bool, true> true_type;
|
225
|
+
typedef boost::unordered::detail::integral_constant<bool, false> false_type;
|
226
|
+
|
227
|
+
#endif
|
228
|
+
|
229
|
+
////////////////////////////////////////////////////////////////////////////
|
230
|
+
// Explicitly call a destructor
|
231
|
+
|
232
|
+
#if defined(BOOST_MSVC)
|
233
|
+
#pragma warning(push)
|
234
|
+
#pragma warning(disable:4100) // unreferenced formal parameter
|
235
|
+
#endif
|
236
|
+
|
237
|
+
template <class T>
|
238
|
+
inline void destroy(T* x) {
|
239
|
+
x->~T();
|
240
|
+
}
|
241
|
+
|
242
|
+
#if defined(BOOST_MSVC)
|
243
|
+
#pragma warning(pop)
|
244
|
+
#endif
|
245
|
+
|
246
|
+
////////////////////////////////////////////////////////////////////////////
|
247
|
+
// Expression test mechanism
|
248
|
+
//
|
249
|
+
// When SFINAE expressions are available, define
|
250
|
+
// BOOST_UNORDERED_HAS_FUNCTION which can check if a function call is
|
251
|
+
// supported by a class, otherwise define BOOST_UNORDERED_HAS_MEMBER which
|
252
|
+
// can detect if a class has the specified member, but not that it has the
|
253
|
+
// correct type, this is good enough for a passable impression of
|
254
|
+
// allocator_traits.
|
255
|
+
|
256
|
+
#if !defined(BOOST_NO_SFINAE_EXPR)
|
257
|
+
|
258
|
+
template <typename T, unsigned int> struct expr_test;
|
259
|
+
template <typename T> struct expr_test<T, sizeof(char)> : T {};
|
260
|
+
template <typename U> static char for_expr_test(U const&);
|
261
|
+
|
262
|
+
# define BOOST_UNORDERED_CHECK_EXPRESSION(count, result, expression) \
|
263
|
+
template <typename U> \
|
264
|
+
static typename boost::unordered::detail::expr_test< \
|
265
|
+
BOOST_PP_CAT(choice, result), \
|
266
|
+
sizeof(boost::unordered::detail::for_expr_test(( \
|
267
|
+
(expression), \
|
268
|
+
0)))>::type test( \
|
269
|
+
BOOST_PP_CAT(choice, count))
|
270
|
+
|
271
|
+
# define BOOST_UNORDERED_DEFAULT_EXPRESSION(count, result) \
|
272
|
+
template <typename U> \
|
273
|
+
static BOOST_PP_CAT(choice, result)::type test( \
|
274
|
+
BOOST_PP_CAT(choice, count))
|
275
|
+
|
276
|
+
# define BOOST_UNORDERED_HAS_FUNCTION(name, thing, args, _) \
|
277
|
+
struct BOOST_PP_CAT(has_, name) \
|
278
|
+
{ \
|
279
|
+
BOOST_UNORDERED_CHECK_EXPRESSION(1, 1, \
|
280
|
+
boost::unordered::detail::make< thing >().name args); \
|
281
|
+
BOOST_UNORDERED_DEFAULT_EXPRESSION(2, 2); \
|
282
|
+
\
|
283
|
+
enum { value = sizeof(test<T>(choose())) == sizeof(choice1::type) };\
|
284
|
+
}
|
285
|
+
|
286
|
+
#else
|
287
|
+
|
288
|
+
template <typename T> struct identity { typedef T type; };
|
289
|
+
|
290
|
+
# define BOOST_UNORDERED_CHECK_MEMBER(count, result, name, member) \
|
291
|
+
\
|
292
|
+
typedef typename boost::unordered::detail::identity<member>::type \
|
293
|
+
BOOST_PP_CAT(check, count); \
|
294
|
+
\
|
295
|
+
template <BOOST_PP_CAT(check, count) e> \
|
296
|
+
struct BOOST_PP_CAT(test, count) { \
|
297
|
+
typedef BOOST_PP_CAT(choice, result) type; \
|
298
|
+
}; \
|
299
|
+
\
|
300
|
+
template <class U> static typename \
|
301
|
+
BOOST_PP_CAT(test, count)<&U::name>::type \
|
302
|
+
test(BOOST_PP_CAT(choice, count))
|
303
|
+
|
304
|
+
# define BOOST_UNORDERED_DEFAULT_MEMBER(count, result) \
|
305
|
+
template <class U> static BOOST_PP_CAT(choice, result)::type \
|
306
|
+
test(BOOST_PP_CAT(choice, count))
|
307
|
+
|
308
|
+
# define BOOST_UNORDERED_HAS_MEMBER(name) \
|
309
|
+
struct BOOST_PP_CAT(has_, name) \
|
310
|
+
{ \
|
311
|
+
struct impl { \
|
312
|
+
struct base_mixin { int name; }; \
|
313
|
+
struct base : public T, public base_mixin {}; \
|
314
|
+
\
|
315
|
+
BOOST_UNORDERED_CHECK_MEMBER(1, 1, name, int base_mixin::*); \
|
316
|
+
BOOST_UNORDERED_DEFAULT_MEMBER(2, 2); \
|
317
|
+
\
|
318
|
+
enum { value = sizeof(choice2::type) == \
|
319
|
+
sizeof(test<base>(choose())) \
|
320
|
+
}; \
|
321
|
+
}; \
|
322
|
+
\
|
323
|
+
enum { value = impl::value }; \
|
324
|
+
}
|
325
|
+
|
326
|
+
#endif
|
327
|
+
|
328
|
+
}}}
|
329
|
+
|
330
|
+
////////////////////////////////////////////////////////////////////////////////
|
331
|
+
//
|
332
|
+
// Allocator traits
|
333
|
+
//
|
334
|
+
// First our implementation, then later light wrappers around the alternatives
|
335
|
+
|
336
|
+
#if BOOST_UNORDERED_USE_ALLOCATOR_TRAITS == 0
|
337
|
+
|
338
|
+
# include <boost/limits.hpp>
|
339
|
+
# include <boost/utility/enable_if.hpp>
|
340
|
+
# include <boost/pointer_to_other.hpp>
|
341
|
+
# if defined(BOOST_NO_SFINAE_EXPR)
|
342
|
+
# include <boost/type_traits/is_same.hpp>
|
343
|
+
# endif
|
344
|
+
|
345
|
+
# if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && \
|
346
|
+
!defined(BOOST_NO_SFINAE_EXPR)
|
347
|
+
# define BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT 1
|
348
|
+
# else
|
349
|
+
# define BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT 0
|
350
|
+
# endif
|
351
|
+
|
352
|
+
namespace boost { namespace unordered { namespace detail {
|
353
|
+
|
354
|
+
// TODO: Does this match std::allocator_traits<Alloc>::rebind_alloc<T>?
|
355
|
+
template <typename Alloc, typename T>
|
356
|
+
struct rebind_wrap
|
357
|
+
{
|
358
|
+
typedef typename Alloc::BOOST_NESTED_TEMPLATE rebind<T>::other type;
|
359
|
+
};
|
360
|
+
|
361
|
+
# if defined(BOOST_MSVC) && BOOST_MSVC <= 1400
|
362
|
+
|
363
|
+
# define BOOST_UNORDERED_DEFAULT_TYPE_TMPLT(tname) \
|
364
|
+
template <typename Tp, typename Default> \
|
365
|
+
struct default_type_ ## tname { \
|
366
|
+
\
|
367
|
+
template <typename X> \
|
368
|
+
static choice1::type test(choice1, typename X::tname* = 0); \
|
369
|
+
\
|
370
|
+
template <typename X> \
|
371
|
+
static choice2::type test(choice2, void* = 0); \
|
372
|
+
\
|
373
|
+
struct DefaultWrap { typedef Default tname; }; \
|
374
|
+
\
|
375
|
+
enum { value = (1 == sizeof(test<Tp>(choose()))) }; \
|
376
|
+
\
|
377
|
+
typedef typename boost::detail::if_true<value>:: \
|
378
|
+
BOOST_NESTED_TEMPLATE then<Tp, DefaultWrap> \
|
379
|
+
::type::tname type; \
|
380
|
+
}
|
381
|
+
|
382
|
+
# else
|
383
|
+
|
384
|
+
template <typename T, typename T2>
|
385
|
+
struct sfinae : T2 {};
|
386
|
+
|
387
|
+
# define BOOST_UNORDERED_DEFAULT_TYPE_TMPLT(tname) \
|
388
|
+
template <typename Tp, typename Default> \
|
389
|
+
struct default_type_ ## tname { \
|
390
|
+
\
|
391
|
+
template <typename X> \
|
392
|
+
static typename boost::unordered::detail::sfinae< \
|
393
|
+
typename X::tname, choice1>::type \
|
394
|
+
test(choice1); \
|
395
|
+
\
|
396
|
+
template <typename X> \
|
397
|
+
static choice2::type test(choice2); \
|
398
|
+
\
|
399
|
+
struct DefaultWrap { typedef Default tname; }; \
|
400
|
+
\
|
401
|
+
enum { value = (1 == sizeof(test<Tp>(choose()))) }; \
|
402
|
+
\
|
403
|
+
typedef typename boost::detail::if_true<value>:: \
|
404
|
+
BOOST_NESTED_TEMPLATE then<Tp, DefaultWrap> \
|
405
|
+
::type::tname type; \
|
406
|
+
}
|
407
|
+
|
408
|
+
# endif
|
409
|
+
|
410
|
+
# define BOOST_UNORDERED_DEFAULT_TYPE(T,tname, arg) \
|
411
|
+
typename default_type_ ## tname<T, arg>::type
|
412
|
+
|
413
|
+
BOOST_UNORDERED_DEFAULT_TYPE_TMPLT(pointer);
|
414
|
+
BOOST_UNORDERED_DEFAULT_TYPE_TMPLT(const_pointer);
|
415
|
+
BOOST_UNORDERED_DEFAULT_TYPE_TMPLT(void_pointer);
|
416
|
+
BOOST_UNORDERED_DEFAULT_TYPE_TMPLT(const_void_pointer);
|
417
|
+
BOOST_UNORDERED_DEFAULT_TYPE_TMPLT(difference_type);
|
418
|
+
BOOST_UNORDERED_DEFAULT_TYPE_TMPLT(size_type);
|
419
|
+
BOOST_UNORDERED_DEFAULT_TYPE_TMPLT(propagate_on_container_copy_assignment);
|
420
|
+
BOOST_UNORDERED_DEFAULT_TYPE_TMPLT(propagate_on_container_move_assignment);
|
421
|
+
BOOST_UNORDERED_DEFAULT_TYPE_TMPLT(propagate_on_container_swap);
|
422
|
+
|
423
|
+
# if !defined(BOOST_NO_SFINAE_EXPR)
|
424
|
+
|
425
|
+
template <typename T>
|
426
|
+
BOOST_UNORDERED_HAS_FUNCTION(
|
427
|
+
select_on_container_copy_construction, U const, (), 0
|
428
|
+
);
|
429
|
+
|
430
|
+
template <typename T>
|
431
|
+
BOOST_UNORDERED_HAS_FUNCTION(
|
432
|
+
max_size, U const, (), 0
|
433
|
+
);
|
434
|
+
|
435
|
+
# if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
436
|
+
|
437
|
+
template <typename T, typename ValueType, typename... Args>
|
438
|
+
BOOST_UNORDERED_HAS_FUNCTION(
|
439
|
+
construct, U, (
|
440
|
+
boost::unordered::detail::make<ValueType*>(),
|
441
|
+
boost::unordered::detail::make<Args const>()...), 2
|
442
|
+
);
|
443
|
+
|
444
|
+
# else
|
445
|
+
|
446
|
+
template <typename T, typename ValueType>
|
447
|
+
BOOST_UNORDERED_HAS_FUNCTION(
|
448
|
+
construct, U, (
|
449
|
+
boost::unordered::detail::make<ValueType*>(),
|
450
|
+
boost::unordered::detail::make<ValueType const>()), 2
|
451
|
+
);
|
452
|
+
|
453
|
+
# endif
|
454
|
+
|
455
|
+
template <typename T, typename ValueType>
|
456
|
+
BOOST_UNORDERED_HAS_FUNCTION(
|
457
|
+
destroy, U, (boost::unordered::detail::make<ValueType*>()), 1
|
458
|
+
);
|
459
|
+
|
460
|
+
# else
|
461
|
+
|
462
|
+
template <typename T>
|
463
|
+
BOOST_UNORDERED_HAS_MEMBER(select_on_container_copy_construction);
|
464
|
+
|
465
|
+
template <typename T>
|
466
|
+
BOOST_UNORDERED_HAS_MEMBER(max_size);
|
467
|
+
|
468
|
+
template <typename T, typename ValueType>
|
469
|
+
BOOST_UNORDERED_HAS_MEMBER(construct);
|
470
|
+
|
471
|
+
template <typename T, typename ValueType>
|
472
|
+
BOOST_UNORDERED_HAS_MEMBER(destroy);
|
473
|
+
|
474
|
+
# endif
|
475
|
+
|
476
|
+
template <typename Alloc>
|
477
|
+
inline Alloc call_select_on_container_copy_construction(const Alloc& rhs,
|
478
|
+
typename boost::enable_if_c<
|
479
|
+
boost::unordered::detail::
|
480
|
+
has_select_on_container_copy_construction<Alloc>::value, void*
|
481
|
+
>::type = 0)
|
482
|
+
{
|
483
|
+
return rhs.select_on_container_copy_construction();
|
484
|
+
}
|
485
|
+
|
486
|
+
template <typename Alloc>
|
487
|
+
inline Alloc call_select_on_container_copy_construction(const Alloc& rhs,
|
488
|
+
typename boost::disable_if_c<
|
489
|
+
boost::unordered::detail::
|
490
|
+
has_select_on_container_copy_construction<Alloc>::value, void*
|
491
|
+
>::type = 0)
|
492
|
+
{
|
493
|
+
return rhs;
|
494
|
+
}
|
495
|
+
|
496
|
+
template <typename SizeType, typename Alloc>
|
497
|
+
inline SizeType call_max_size(const Alloc& a,
|
498
|
+
typename boost::enable_if_c<
|
499
|
+
boost::unordered::detail::has_max_size<Alloc>::value, void*
|
500
|
+
>::type = 0)
|
501
|
+
{
|
502
|
+
return a.max_size();
|
503
|
+
}
|
504
|
+
|
505
|
+
template <typename SizeType, typename Alloc>
|
506
|
+
inline SizeType call_max_size(const Alloc&, typename boost::disable_if_c<
|
507
|
+
boost::unordered::detail::has_max_size<Alloc>::value, void*
|
508
|
+
>::type = 0)
|
509
|
+
{
|
510
|
+
return (std::numeric_limits<SizeType>::max)();
|
511
|
+
}
|
512
|
+
|
513
|
+
template <typename Alloc>
|
514
|
+
struct allocator_traits
|
515
|
+
{
|
516
|
+
typedef Alloc allocator_type;
|
517
|
+
typedef typename Alloc::value_type value_type;
|
518
|
+
|
519
|
+
typedef BOOST_UNORDERED_DEFAULT_TYPE(Alloc, pointer, value_type*)
|
520
|
+
pointer;
|
521
|
+
|
522
|
+
template <typename T>
|
523
|
+
struct pointer_to_other : boost::pointer_to_other<pointer, T> {};
|
524
|
+
|
525
|
+
typedef BOOST_UNORDERED_DEFAULT_TYPE(Alloc, const_pointer,
|
526
|
+
typename pointer_to_other<const value_type>::type)
|
527
|
+
const_pointer;
|
528
|
+
|
529
|
+
//typedef BOOST_UNORDERED_DEFAULT_TYPE(Alloc, void_pointer,
|
530
|
+
// typename pointer_to_other<void>::type)
|
531
|
+
// void_pointer;
|
532
|
+
//
|
533
|
+
//typedef BOOST_UNORDERED_DEFAULT_TYPE(Alloc, const_void_pointer,
|
534
|
+
// typename pointer_to_other<const void>::type)
|
535
|
+
// const_void_pointer;
|
536
|
+
|
537
|
+
typedef BOOST_UNORDERED_DEFAULT_TYPE(Alloc, difference_type,
|
538
|
+
std::ptrdiff_t) difference_type;
|
539
|
+
|
540
|
+
typedef BOOST_UNORDERED_DEFAULT_TYPE(Alloc, size_type, std::size_t)
|
541
|
+
size_type;
|
542
|
+
|
543
|
+
// TODO: rebind_alloc and rebind_traits
|
544
|
+
|
545
|
+
static pointer allocate(Alloc& a, size_type n)
|
546
|
+
{ return a.allocate(n); }
|
547
|
+
|
548
|
+
// I never use this, so I'll just comment it out for now.
|
549
|
+
//
|
550
|
+
//static pointer allocate(Alloc& a, size_type n,
|
551
|
+
// const_void_pointer hint)
|
552
|
+
// { return DEFAULT_FUNC(allocate, pointer)(a, n, hint); }
|
553
|
+
|
554
|
+
static void deallocate(Alloc& a, pointer p, size_type n)
|
555
|
+
{ a.deallocate(p, n); }
|
556
|
+
|
557
|
+
public:
|
558
|
+
|
559
|
+
# if BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT
|
560
|
+
|
561
|
+
template <typename T, typename... Args>
|
562
|
+
static typename boost::enable_if_c<
|
563
|
+
boost::unordered::detail::has_construct<Alloc, T, Args...>
|
564
|
+
::value>::type
|
565
|
+
construct(Alloc& a, T* p, BOOST_FWD_REF(Args)... x)
|
566
|
+
{
|
567
|
+
a.construct(p, boost::forward<Args>(x)...);
|
568
|
+
}
|
569
|
+
|
570
|
+
template <typename T, typename... Args>
|
571
|
+
static typename boost::disable_if_c<
|
572
|
+
boost::unordered::detail::has_construct<Alloc, T, Args...>
|
573
|
+
::value>::type
|
574
|
+
construct(Alloc&, T* p, BOOST_FWD_REF(Args)... x)
|
575
|
+
{
|
576
|
+
new ((void*) p) T(boost::forward<Args>(x)...);
|
577
|
+
}
|
578
|
+
|
579
|
+
template <typename T>
|
580
|
+
static typename boost::enable_if_c<
|
581
|
+
boost::unordered::detail::has_destroy<Alloc, T>::value>::type
|
582
|
+
destroy(Alloc& a, T* p)
|
583
|
+
{
|
584
|
+
a.destroy(p);
|
585
|
+
}
|
586
|
+
|
587
|
+
template <typename T>
|
588
|
+
static typename boost::disable_if_c<
|
589
|
+
boost::unordered::detail::has_destroy<Alloc, T>::value>::type
|
590
|
+
destroy(Alloc&, T* p)
|
591
|
+
{
|
592
|
+
boost::unordered::detail::destroy(p);
|
593
|
+
}
|
594
|
+
|
595
|
+
# elif !defined(BOOST_NO_SFINAE_EXPR)
|
596
|
+
|
597
|
+
template <typename T>
|
598
|
+
static typename boost::enable_if_c<
|
599
|
+
boost::unordered::detail::has_construct<Alloc, T>::value>::type
|
600
|
+
construct(Alloc& a, T* p, T const& x)
|
601
|
+
{
|
602
|
+
a.construct(p, x);
|
603
|
+
}
|
604
|
+
|
605
|
+
template <typename T>
|
606
|
+
static typename boost::disable_if_c<
|
607
|
+
boost::unordered::detail::has_construct<Alloc, T>::value>::type
|
608
|
+
construct(Alloc&, T* p, T const& x)
|
609
|
+
{
|
610
|
+
new ((void*) p) T(x);
|
611
|
+
}
|
612
|
+
|
613
|
+
template <typename T>
|
614
|
+
static typename boost::enable_if_c<
|
615
|
+
boost::unordered::detail::has_destroy<Alloc, T>::value>::type
|
616
|
+
destroy(Alloc& a, T* p)
|
617
|
+
{
|
618
|
+
a.destroy(p);
|
619
|
+
}
|
620
|
+
|
621
|
+
template <typename T>
|
622
|
+
static typename boost::disable_if_c<
|
623
|
+
boost::unordered::detail::has_destroy<Alloc, T>::value>::type
|
624
|
+
destroy(Alloc&, T* p)
|
625
|
+
{
|
626
|
+
boost::unordered::detail::destroy(p);
|
627
|
+
}
|
628
|
+
|
629
|
+
# else
|
630
|
+
|
631
|
+
// If we don't have SFINAE expressions, only call construct for the
|
632
|
+
// copy constructor for the allocator's value_type - as that's
|
633
|
+
// the only construct method that old fashioned allocators support.
|
634
|
+
|
635
|
+
template <typename T>
|
636
|
+
static void construct(Alloc& a, T* p, T const& x,
|
637
|
+
typename boost::enable_if_c<
|
638
|
+
boost::unordered::detail::has_construct<Alloc, T>::value &&
|
639
|
+
boost::is_same<T, value_type>::value,
|
640
|
+
void*>::type = 0)
|
641
|
+
{
|
642
|
+
a.construct(p, x);
|
643
|
+
}
|
644
|
+
|
645
|
+
template <typename T>
|
646
|
+
static void construct(Alloc&, T* p, T const& x,
|
647
|
+
typename boost::disable_if_c<
|
648
|
+
boost::unordered::detail::has_construct<Alloc, T>::value &&
|
649
|
+
boost::is_same<T, value_type>::value,
|
650
|
+
void*>::type = 0)
|
651
|
+
{
|
652
|
+
new ((void*) p) T(x);
|
653
|
+
}
|
654
|
+
|
655
|
+
template <typename T>
|
656
|
+
static void destroy(Alloc& a, T* p,
|
657
|
+
typename boost::enable_if_c<
|
658
|
+
boost::unordered::detail::has_destroy<Alloc, T>::value &&
|
659
|
+
boost::is_same<T, value_type>::value,
|
660
|
+
void*>::type = 0)
|
661
|
+
{
|
662
|
+
a.destroy(p);
|
663
|
+
}
|
664
|
+
|
665
|
+
template <typename T>
|
666
|
+
static void destroy(Alloc&, T* p,
|
667
|
+
typename boost::disable_if_c<
|
668
|
+
boost::unordered::detail::has_destroy<Alloc, T>::value &&
|
669
|
+
boost::is_same<T, value_type>::value,
|
670
|
+
void*>::type = 0)
|
671
|
+
{
|
672
|
+
boost::unordered::detail::destroy(p);
|
673
|
+
}
|
674
|
+
|
675
|
+
# endif
|
676
|
+
|
677
|
+
static size_type max_size(const Alloc& a)
|
678
|
+
{
|
679
|
+
return boost::unordered::detail::call_max_size<size_type>(a);
|
680
|
+
}
|
681
|
+
|
682
|
+
// Allocator propagation on construction
|
683
|
+
|
684
|
+
static Alloc select_on_container_copy_construction(Alloc const& rhs)
|
685
|
+
{
|
686
|
+
return boost::unordered::detail::
|
687
|
+
call_select_on_container_copy_construction(rhs);
|
688
|
+
}
|
689
|
+
|
690
|
+
// Allocator propagation on assignment and swap.
|
691
|
+
// Return true if lhs is modified.
|
692
|
+
typedef BOOST_UNORDERED_DEFAULT_TYPE(
|
693
|
+
Alloc, propagate_on_container_copy_assignment, false_type)
|
694
|
+
propagate_on_container_copy_assignment;
|
695
|
+
typedef BOOST_UNORDERED_DEFAULT_TYPE(
|
696
|
+
Alloc,propagate_on_container_move_assignment, false_type)
|
697
|
+
propagate_on_container_move_assignment;
|
698
|
+
typedef BOOST_UNORDERED_DEFAULT_TYPE(
|
699
|
+
Alloc,propagate_on_container_swap,false_type)
|
700
|
+
propagate_on_container_swap;
|
701
|
+
};
|
702
|
+
}}}
|
703
|
+
|
704
|
+
# undef BOOST_UNORDERED_DEFAULT_TYPE_TMPLT
|
705
|
+
# undef BOOST_UNORDERED_DEFAULT_TYPE
|
706
|
+
|
707
|
+
////////////////////////////////////////////////////////////////////////////////
|
708
|
+
//
|
709
|
+
// std::allocator_traits
|
710
|
+
|
711
|
+
#elif BOOST_UNORDERED_USE_ALLOCATOR_TRAITS == 1
|
712
|
+
|
713
|
+
# include <memory>
|
714
|
+
|
715
|
+
# define BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT 1
|
716
|
+
|
717
|
+
namespace boost { namespace unordered { namespace detail {
|
718
|
+
|
719
|
+
template <typename Alloc>
|
720
|
+
struct allocator_traits : std::allocator_traits<Alloc> {};
|
721
|
+
|
722
|
+
template <typename Alloc, typename T>
|
723
|
+
struct rebind_wrap
|
724
|
+
{
|
725
|
+
typedef typename std::allocator_traits<Alloc>::
|
726
|
+
template rebind_alloc<T> type;
|
727
|
+
};
|
728
|
+
}}}
|
729
|
+
|
730
|
+
////////////////////////////////////////////////////////////////////////////////
|
731
|
+
//
|
732
|
+
// boost::container::allocator_traits
|
733
|
+
|
734
|
+
#elif BOOST_UNORDERED_USE_ALLOCATOR_TRAITS == 2
|
735
|
+
|
736
|
+
# include <boost/container/allocator_traits.hpp>
|
737
|
+
|
738
|
+
# define BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT 0
|
739
|
+
|
740
|
+
namespace boost { namespace unordered { namespace detail {
|
741
|
+
|
742
|
+
template <typename Alloc>
|
743
|
+
struct allocator_traits :
|
744
|
+
boost::container::allocator_traits<Alloc> {};
|
745
|
+
|
746
|
+
template <typename Alloc, typename T>
|
747
|
+
struct rebind_wrap :
|
748
|
+
boost::container::allocator_traits<Alloc>::
|
749
|
+
template portable_rebind_alloc<T>
|
750
|
+
{};
|
751
|
+
|
752
|
+
}}}
|
753
|
+
|
754
|
+
#else
|
755
|
+
|
756
|
+
#error "Invalid BOOST_UNORDERED_USE_ALLOCATOR_TRAITS value."
|
757
|
+
|
758
|
+
#endif
|
759
|
+
|
760
|
+
|
761
|
+
namespace boost { namespace unordered { namespace detail {
|
762
|
+
|
763
|
+
////////////////////////////////////////////////////////////////////////////
|
764
|
+
// call_construct
|
765
|
+
|
766
|
+
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
767
|
+
|
768
|
+
# if BOOST_UNORDERED_DETAIL_FULL_CONSTRUCT
|
769
|
+
|
770
|
+
template <typename Alloc, typename T, typename... Args>
|
771
|
+
inline void call_construct(Alloc& alloc, T* address,
|
772
|
+
BOOST_FWD_REF(Args)... args)
|
773
|
+
{
|
774
|
+
boost::unordered::detail::allocator_traits<Alloc>::construct(alloc,
|
775
|
+
address, boost::forward<Args>(args)...);
|
776
|
+
}
|
777
|
+
|
778
|
+
template <typename Alloc, typename T>
|
779
|
+
inline void destroy_value_impl(Alloc& alloc, T* x) {
|
780
|
+
boost::unordered::detail::allocator_traits<Alloc>::destroy(alloc, x);
|
781
|
+
}
|
782
|
+
|
783
|
+
|
784
|
+
# else
|
785
|
+
|
786
|
+
template <typename Alloc, typename T, typename... Args>
|
787
|
+
inline void call_construct(Alloc&, T* address,
|
788
|
+
BOOST_FWD_REF(Args)... args)
|
789
|
+
{
|
790
|
+
new((void*) address) T(boost::forward<Args>(args)...);
|
791
|
+
}
|
792
|
+
|
793
|
+
template <typename Alloc, typename T>
|
794
|
+
inline void destroy_value_impl(Alloc&, T* x) {
|
795
|
+
boost::unordered::detail::destroy(x);
|
796
|
+
}
|
797
|
+
|
798
|
+
|
799
|
+
# endif
|
800
|
+
|
801
|
+
#else
|
802
|
+
|
803
|
+
template <typename Alloc, typename T>
|
804
|
+
inline void destroy_value_impl(Alloc&, T* x) {
|
805
|
+
boost::unordered::detail::destroy(x);
|
806
|
+
}
|
807
|
+
|
808
|
+
#endif
|
809
|
+
|
810
|
+
////////////////////////////////////////////////////////////////////////////
|
811
|
+
// Construct from tuple
|
812
|
+
//
|
813
|
+
// Used for piecewise construction.
|
814
|
+
|
815
|
+
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
816
|
+
|
817
|
+
# define BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE(n, namespace_) \
|
818
|
+
template<typename Alloc, typename T> \
|
819
|
+
void construct_from_tuple(Alloc& alloc, T* ptr, namespace_ tuple<>) \
|
820
|
+
{ \
|
821
|
+
boost::unordered::detail::call_construct(alloc, ptr); \
|
822
|
+
} \
|
823
|
+
\
|
824
|
+
BOOST_PP_REPEAT_FROM_TO(1, n, \
|
825
|
+
BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE_IMPL, namespace_)
|
826
|
+
|
827
|
+
# define BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE_IMPL(z, n, namespace_) \
|
828
|
+
template<typename Alloc, typename T, \
|
829
|
+
BOOST_PP_ENUM_PARAMS_Z(z, n, typename A)> \
|
830
|
+
void construct_from_tuple(Alloc& alloc, T* ptr, \
|
831
|
+
namespace_ tuple<BOOST_PP_ENUM_PARAMS_Z(z, n, A)> const& x) \
|
832
|
+
{ \
|
833
|
+
boost::unordered::detail::call_construct(alloc, ptr, \
|
834
|
+
BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_GET_TUPLE_ARG, namespace_) \
|
835
|
+
); \
|
836
|
+
}
|
837
|
+
|
838
|
+
# define BOOST_UNORDERED_GET_TUPLE_ARG(z, n, namespace_) \
|
839
|
+
namespace_ get<n>(x)
|
840
|
+
|
841
|
+
#elif !defined(__SUNPRO_CC)
|
842
|
+
|
843
|
+
# define BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE(n, namespace_) \
|
844
|
+
template<typename Alloc, typename T> \
|
845
|
+
void construct_from_tuple(Alloc&, T* ptr, namespace_ tuple<>) \
|
846
|
+
{ \
|
847
|
+
new ((void*) ptr) T(); \
|
848
|
+
} \
|
849
|
+
\
|
850
|
+
BOOST_PP_REPEAT_FROM_TO(1, n, \
|
851
|
+
BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE_IMPL, namespace_)
|
852
|
+
|
853
|
+
# define BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE_IMPL(z, n, namespace_) \
|
854
|
+
template<typename Alloc, typename T, \
|
855
|
+
BOOST_PP_ENUM_PARAMS_Z(z, n, typename A)> \
|
856
|
+
void construct_from_tuple(Alloc&, T* ptr, \
|
857
|
+
namespace_ tuple<BOOST_PP_ENUM_PARAMS_Z(z, n, A)> const& x) \
|
858
|
+
{ \
|
859
|
+
new ((void*) ptr) T( \
|
860
|
+
BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_GET_TUPLE_ARG, namespace_) \
|
861
|
+
); \
|
862
|
+
}
|
863
|
+
|
864
|
+
# define BOOST_UNORDERED_GET_TUPLE_ARG(z, n, namespace_) \
|
865
|
+
namespace_ get<n>(x)
|
866
|
+
|
867
|
+
#else
|
868
|
+
|
869
|
+
template <int N> struct length {};
|
870
|
+
|
871
|
+
# define BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE(n, namespace_) \
|
872
|
+
template<typename Alloc, typename T> \
|
873
|
+
void construct_from_tuple_impl( \
|
874
|
+
boost::unordered::detail::length<0>, Alloc&, T* ptr, \
|
875
|
+
namespace_ tuple<>) \
|
876
|
+
{ \
|
877
|
+
new ((void*) ptr) T(); \
|
878
|
+
} \
|
879
|
+
\
|
880
|
+
BOOST_PP_REPEAT_FROM_TO(1, n, \
|
881
|
+
BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE_IMPL, namespace_)
|
882
|
+
|
883
|
+
# define BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE_IMPL(z, n, namespace_) \
|
884
|
+
template<typename Alloc, typename T, \
|
885
|
+
BOOST_PP_ENUM_PARAMS_Z(z, n, typename A)> \
|
886
|
+
void construct_from_tuple_impl( \
|
887
|
+
boost::unordered::detail::length<n>, Alloc&, T* ptr, \
|
888
|
+
namespace_ tuple<BOOST_PP_ENUM_PARAMS_Z(z, n, A)> const& x) \
|
889
|
+
{ \
|
890
|
+
new ((void*) ptr) T( \
|
891
|
+
BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_GET_TUPLE_ARG, namespace_) \
|
892
|
+
); \
|
893
|
+
}
|
894
|
+
|
895
|
+
# define BOOST_UNORDERED_GET_TUPLE_ARG(z, n, namespace_) \
|
896
|
+
namespace_ get<n>(x)
|
897
|
+
|
898
|
+
#endif
|
899
|
+
|
900
|
+
BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE(10, boost::)
|
901
|
+
|
902
|
+
#if !defined(__SUNPRO_CC) && !defined(BOOST_NO_CXX11_HDR_TUPLE)
|
903
|
+
BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE(10, std::)
|
904
|
+
#endif
|
905
|
+
|
906
|
+
#undef BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE
|
907
|
+
#undef BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE_IMPL
|
908
|
+
#undef BOOST_UNORDERED_GET_TUPLE_ARG
|
909
|
+
|
910
|
+
#if defined(__SUNPRO_CC)
|
911
|
+
|
912
|
+
template <typename Alloc, typename T, typename Tuple>
|
913
|
+
void construct_from_tuple(Alloc& alloc, T* ptr, Tuple const& x)
|
914
|
+
{
|
915
|
+
construct_from_tuple_impl(
|
916
|
+
boost::unordered::detail::length<
|
917
|
+
boost::tuples::length<Tuple>::value>(),
|
918
|
+
alloc, ptr, x);
|
919
|
+
}
|
920
|
+
|
921
|
+
#endif
|
922
|
+
|
923
|
+
////////////////////////////////////////////////////////////////////////////
|
924
|
+
// Trait to check for piecewise construction.
|
925
|
+
|
926
|
+
template <typename A0>
|
927
|
+
struct use_piecewise {
|
928
|
+
static choice1::type test(choice1,
|
929
|
+
boost::unordered::piecewise_construct_t);
|
930
|
+
|
931
|
+
static choice2::type test(choice2, ...);
|
932
|
+
|
933
|
+
enum { value = sizeof(choice1::type) ==
|
934
|
+
sizeof(test(choose(), boost::unordered::detail::make<A0>())) };
|
935
|
+
};
|
936
|
+
|
937
|
+
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
938
|
+
|
939
|
+
////////////////////////////////////////////////////////////////////////////
|
940
|
+
// Construct from variadic parameters
|
941
|
+
|
942
|
+
// For the standard pair constructor.
|
943
|
+
|
944
|
+
template <typename Alloc, typename T, typename... Args>
|
945
|
+
inline void construct_value_impl(Alloc& alloc, T* address,
|
946
|
+
BOOST_FWD_REF(Args)... args)
|
947
|
+
{
|
948
|
+
boost::unordered::detail::call_construct(alloc,
|
949
|
+
address, boost::forward<Args>(args)...);
|
950
|
+
}
|
951
|
+
|
952
|
+
// Special case for piece_construct
|
953
|
+
//
|
954
|
+
// TODO: When possible, it might be better to use std::pair's
|
955
|
+
// constructor for std::piece_construct with std::tuple.
|
956
|
+
|
957
|
+
template <typename Alloc, typename A, typename B,
|
958
|
+
typename A0, typename A1, typename A2>
|
959
|
+
inline typename enable_if<use_piecewise<A0>, void>::type
|
960
|
+
construct_value_impl(Alloc& alloc, std::pair<A, B>* address,
|
961
|
+
BOOST_FWD_REF(A0), BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2)
|
962
|
+
{
|
963
|
+
boost::unordered::detail::construct_from_tuple(alloc,
|
964
|
+
boost::addressof(address->first), boost::forward<A1>(a1));
|
965
|
+
boost::unordered::detail::construct_from_tuple(alloc,
|
966
|
+
boost::addressof(address->second), boost::forward<A2>(a2));
|
967
|
+
}
|
968
|
+
|
969
|
+
#else // BOOST_NO_CXX11_VARIADIC_TEMPLATES
|
970
|
+
|
971
|
+
////////////////////////////////////////////////////////////////////////////////
|
972
|
+
// Construct from emplace_args
|
973
|
+
|
974
|
+
// Explicitly write out first three overloads for the sake of sane
|
975
|
+
// error messages.
|
976
|
+
|
977
|
+
template <typename Alloc, typename T, typename A0>
|
978
|
+
inline void construct_value_impl(Alloc&, T* address,
|
979
|
+
emplace_args1<A0> const& args)
|
980
|
+
{
|
981
|
+
new((void*) address) T(boost::forward<A0>(args.a0));
|
982
|
+
}
|
983
|
+
|
984
|
+
template <typename Alloc, typename T, typename A0, typename A1>
|
985
|
+
inline void construct_value_impl(Alloc&, T* address,
|
986
|
+
emplace_args2<A0, A1> const& args)
|
987
|
+
{
|
988
|
+
new((void*) address) T(
|
989
|
+
boost::forward<A0>(args.a0),
|
990
|
+
boost::forward<A1>(args.a1)
|
991
|
+
);
|
992
|
+
}
|
993
|
+
|
994
|
+
template <typename Alloc, typename T, typename A0, typename A1, typename A2>
|
995
|
+
inline void construct_value_impl(Alloc&, T* address,
|
996
|
+
emplace_args3<A0, A1, A2> const& args)
|
997
|
+
{
|
998
|
+
new((void*) address) T(
|
999
|
+
boost::forward<A0>(args.a0),
|
1000
|
+
boost::forward<A1>(args.a1),
|
1001
|
+
boost::forward<A2>(args.a2)
|
1002
|
+
);
|
1003
|
+
}
|
1004
|
+
|
1005
|
+
// Use a macro for the rest.
|
1006
|
+
|
1007
|
+
#define BOOST_UNORDERED_CONSTRUCT_IMPL(z, num_params, _) \
|
1008
|
+
template < \
|
1009
|
+
typename Alloc, typename T, \
|
1010
|
+
BOOST_PP_ENUM_PARAMS_Z(z, num_params, typename A) \
|
1011
|
+
> \
|
1012
|
+
inline void construct_value_impl(Alloc&, T* address, \
|
1013
|
+
boost::unordered::detail::BOOST_PP_CAT(emplace_args,num_params) < \
|
1014
|
+
BOOST_PP_ENUM_PARAMS_Z(z, num_params, A) \
|
1015
|
+
> const& args) \
|
1016
|
+
{ \
|
1017
|
+
new((void*) address) T( \
|
1018
|
+
BOOST_PP_ENUM_##z(num_params, BOOST_UNORDERED_CALL_FORWARD, \
|
1019
|
+
args.a)); \
|
1020
|
+
}
|
1021
|
+
|
1022
|
+
BOOST_PP_REPEAT_FROM_TO(4, BOOST_UNORDERED_EMPLACE_LIMIT,
|
1023
|
+
BOOST_UNORDERED_CONSTRUCT_IMPL, _)
|
1024
|
+
|
1025
|
+
#undef BOOST_UNORDERED_CONSTRUCT_IMPL
|
1026
|
+
|
1027
|
+
// Construct with piece_construct
|
1028
|
+
|
1029
|
+
template <typename Alloc, typename A, typename B,
|
1030
|
+
typename A0, typename A1, typename A2>
|
1031
|
+
inline void construct_value_impl(Alloc& alloc, std::pair<A, B>* address,
|
1032
|
+
boost::unordered::detail::emplace_args3<A0, A1, A2> const& args,
|
1033
|
+
typename enable_if<use_piecewise<A0>, void*>::type = 0)
|
1034
|
+
{
|
1035
|
+
boost::unordered::detail::construct_from_tuple(alloc,
|
1036
|
+
boost::addressof(address->first), args.a1);
|
1037
|
+
boost::unordered::detail::construct_from_tuple(alloc,
|
1038
|
+
boost::addressof(address->second), args.a2);
|
1039
|
+
}
|
1040
|
+
|
1041
|
+
#endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES
|
1042
|
+
|
1043
|
+
}}}
|
1044
|
+
|
1045
|
+
////////////////////////////////////////////////////////////////////////////////
|
1046
|
+
//
|
1047
|
+
// Some helper functions for allocating & constructing
|
1048
|
+
|
1049
|
+
namespace boost { namespace unordered { namespace detail {
|
1050
|
+
|
1051
|
+
////////////////////////////////////////////////////////////////////////////
|
1052
|
+
//
|
1053
|
+
// array_constructor
|
1054
|
+
//
|
1055
|
+
// Allocate and construct an array in an exception safe manner, and
|
1056
|
+
// clean up if an exception is thrown before the container takes charge
|
1057
|
+
// of it.
|
1058
|
+
|
1059
|
+
template <typename Allocator>
|
1060
|
+
struct array_constructor
|
1061
|
+
{
|
1062
|
+
typedef boost::unordered::detail::allocator_traits<Allocator> traits;
|
1063
|
+
typedef typename traits::pointer pointer;
|
1064
|
+
|
1065
|
+
Allocator& alloc_;
|
1066
|
+
pointer ptr_;
|
1067
|
+
pointer constructed_;
|
1068
|
+
std::size_t length_;
|
1069
|
+
|
1070
|
+
array_constructor(Allocator& a)
|
1071
|
+
: alloc_(a), ptr_(), constructed_(), length_(0)
|
1072
|
+
{
|
1073
|
+
constructed_ = pointer();
|
1074
|
+
ptr_ = pointer();
|
1075
|
+
}
|
1076
|
+
|
1077
|
+
~array_constructor() {
|
1078
|
+
if (ptr_) {
|
1079
|
+
for(pointer p = ptr_; p != constructed_; ++p)
|
1080
|
+
traits::destroy(alloc_, boost::addressof(*p));
|
1081
|
+
|
1082
|
+
traits::deallocate(alloc_, ptr_, length_);
|
1083
|
+
}
|
1084
|
+
}
|
1085
|
+
|
1086
|
+
template <typename V>
|
1087
|
+
void construct(V const& v, std::size_t l)
|
1088
|
+
{
|
1089
|
+
BOOST_ASSERT(!ptr_);
|
1090
|
+
length_ = l;
|
1091
|
+
ptr_ = traits::allocate(alloc_, length_);
|
1092
|
+
pointer end = ptr_ + static_cast<std::ptrdiff_t>(length_);
|
1093
|
+
for(constructed_ = ptr_; constructed_ != end; ++constructed_)
|
1094
|
+
traits::construct(alloc_, boost::addressof(*constructed_), v);
|
1095
|
+
}
|
1096
|
+
|
1097
|
+
pointer get() const
|
1098
|
+
{
|
1099
|
+
return ptr_;
|
1100
|
+
}
|
1101
|
+
|
1102
|
+
pointer release()
|
1103
|
+
{
|
1104
|
+
pointer p(ptr_);
|
1105
|
+
ptr_ = pointer();
|
1106
|
+
return p;
|
1107
|
+
}
|
1108
|
+
|
1109
|
+
private:
|
1110
|
+
|
1111
|
+
array_constructor(array_constructor const&);
|
1112
|
+
array_constructor& operator=(array_constructor const&);
|
1113
|
+
};
|
1114
|
+
}}}
|
1115
|
+
|
1116
|
+
#if defined(BOOST_MSVC)
|
1117
|
+
#pragma warning(pop)
|
1118
|
+
#endif
|
1119
|
+
|
1120
|
+
#endif
|