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
@@ -23,6 +23,17 @@
|
|
23
23
|
CLASS& operator=(CLASS const&) = delete;
|
24
24
|
|
25
25
|
#else // BOOST_NO_CXX11_DELETED_FUNCTIONS
|
26
|
+
#if defined(BOOST_MSVC) && _MSC_VER >= 1600
|
27
|
+
#define BOOST_THREAD_DELETE_COPY_CTOR(CLASS) \
|
28
|
+
private: \
|
29
|
+
CLASS(CLASS const&); \
|
30
|
+
public:
|
31
|
+
|
32
|
+
#define BOOST_THREAD_DELETE_COPY_ASSIGN(CLASS) \
|
33
|
+
private: \
|
34
|
+
CLASS& operator=(CLASS const&); \
|
35
|
+
public:
|
36
|
+
#else
|
26
37
|
#define BOOST_THREAD_DELETE_COPY_CTOR(CLASS) \
|
27
38
|
private: \
|
28
39
|
CLASS(CLASS&); \
|
@@ -32,6 +43,7 @@
|
|
32
43
|
private: \
|
33
44
|
CLASS& operator=(CLASS&); \
|
34
45
|
public:
|
46
|
+
#endif
|
35
47
|
#endif // BOOST_NO_CXX11_DELETED_FUNCTIONS
|
36
48
|
|
37
49
|
/**
|
@@ -0,0 +1,1351 @@
|
|
1
|
+
// Copyright (C) 2012-2013 Vicente J. Botet Escriba
|
2
|
+
//
|
3
|
+
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
4
|
+
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
5
|
+
|
6
|
+
// 2013/04 Vicente J. Botet Escriba
|
7
|
+
// Provide implementation up to 9 parameters when BOOST_NO_CXX11_VARIADIC_TEMPLATES is defined.
|
8
|
+
// Make use of Boost.Move
|
9
|
+
// Make use of Boost.Tuple (movable)
|
10
|
+
// 2012 Vicente J. Botet Escriba
|
11
|
+
// Provide implementation _RET using bind when BOOST_NO_CXX11_HDR_FUNCTIONAL and BOOST_NO_SFINAE_EXPR are not defined
|
12
|
+
// 2012 Vicente J. Botet Escriba
|
13
|
+
// Adapt to boost libc++ implementation
|
14
|
+
|
15
|
+
//===----------------------------------------------------------------------===//
|
16
|
+
//
|
17
|
+
// The LLVM Compiler Infrastructure
|
18
|
+
//
|
19
|
+
// This file is dual licensed under the MIT and the University of Illinois Open
|
20
|
+
// Source Licenses. See LICENSE.TXT for details.
|
21
|
+
//
|
22
|
+
// The invoke code is based on the one from libcxx.
|
23
|
+
//===----------------------------------------------------------------------===//
|
24
|
+
|
25
|
+
#ifndef BOOST_THREAD_DETAIL_INVOKE_HPP
|
26
|
+
#define BOOST_THREAD_DETAIL_INVOKE_HPP
|
27
|
+
|
28
|
+
#include <boost/config.hpp>
|
29
|
+
#include <boost/static_assert.hpp>
|
30
|
+
#include <boost/thread/detail/move.hpp>
|
31
|
+
#include <boost/type_traits/is_base_of.hpp>
|
32
|
+
#include <boost/type_traits/remove_reference.hpp>
|
33
|
+
#ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL
|
34
|
+
#include <functional>
|
35
|
+
#endif
|
36
|
+
|
37
|
+
namespace boost
|
38
|
+
{
|
39
|
+
namespace detail
|
40
|
+
{
|
41
|
+
|
42
|
+
|
43
|
+
#if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && \
|
44
|
+
! defined(BOOST_NO_SFINAE_EXPR) && \
|
45
|
+
! defined(BOOST_NO_CXX11_DECLTYPE) && \
|
46
|
+
! defined(BOOST_NO_CXX11_DECLTYPE_N3276) && \
|
47
|
+
! defined(BOOST_NO_CXX11_AUTO)
|
48
|
+
|
49
|
+
#define BOOST_THREAD_PROVIDES_INVOKE
|
50
|
+
|
51
|
+
#if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
52
|
+
// bullets 1 and 2
|
53
|
+
|
54
|
+
template <class Fp, class A0, class ...Args>
|
55
|
+
inline auto
|
56
|
+
invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
|
57
|
+
-> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...))
|
58
|
+
{
|
59
|
+
return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
|
60
|
+
}
|
61
|
+
|
62
|
+
template <class Fp, class A0, class ...Args>
|
63
|
+
inline auto
|
64
|
+
invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
|
65
|
+
-> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...))
|
66
|
+
{
|
67
|
+
return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
|
68
|
+
}
|
69
|
+
|
70
|
+
// bullets 3 and 4
|
71
|
+
|
72
|
+
template <class Fp, class A0>
|
73
|
+
inline auto
|
74
|
+
invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
|
75
|
+
-> decltype(boost::forward<A0>(a0).*f)
|
76
|
+
{
|
77
|
+
return boost::forward<A0>(a0).*f;
|
78
|
+
}
|
79
|
+
|
80
|
+
template <class Fp, class A0>
|
81
|
+
inline auto
|
82
|
+
invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
|
83
|
+
-> decltype((*boost::forward<A0>(a0)).*f)
|
84
|
+
{
|
85
|
+
return (*boost::forward<A0>(a0)).*f;
|
86
|
+
}
|
87
|
+
|
88
|
+
// bullet 5
|
89
|
+
|
90
|
+
template <class Fp, class ...Args>
|
91
|
+
inline auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args)
|
92
|
+
-> decltype(boost::forward<Fp>(f)(boost::forward<Args>(args)...))
|
93
|
+
{
|
94
|
+
return boost::forward<Fp>(f)(boost::forward<Args>(args)...);
|
95
|
+
}
|
96
|
+
#else // BOOST_NO_CXX11_VARIADIC_TEMPLATES
|
97
|
+
|
98
|
+
// bullets 1 and 2
|
99
|
+
|
100
|
+
template <class Fp, class A0>
|
101
|
+
inline
|
102
|
+
auto
|
103
|
+
invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
|
104
|
+
-> decltype((boost::forward<A0>(a0).*f)())
|
105
|
+
{
|
106
|
+
return (boost::forward<A0>(a0).*f)();
|
107
|
+
}
|
108
|
+
template <class Fp, class A0, class A1>
|
109
|
+
inline
|
110
|
+
auto
|
111
|
+
invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
|
112
|
+
-> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(a1)))
|
113
|
+
{
|
114
|
+
return (boost::forward<A0>(a0).*f)(boost::forward<Args>(a1));
|
115
|
+
}
|
116
|
+
template <class Fp, class A0, class A1, class A2>
|
117
|
+
inline
|
118
|
+
auto
|
119
|
+
invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
|
120
|
+
-> decltype((boost::forward<A0>(a0).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2)))
|
121
|
+
{
|
122
|
+
return (boost::forward<A0>(a0).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2));
|
123
|
+
}
|
124
|
+
|
125
|
+
template <class Fp, class A0>
|
126
|
+
inline
|
127
|
+
auto
|
128
|
+
invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
|
129
|
+
-> decltype(((*boost::forward<A0>(a0)).*f)())
|
130
|
+
{
|
131
|
+
return ((*boost::forward<A0>(a0)).*f)();
|
132
|
+
}
|
133
|
+
template <class Fp, class A0, class A1>
|
134
|
+
inline
|
135
|
+
auto
|
136
|
+
invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
|
137
|
+
-> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1)))
|
138
|
+
{
|
139
|
+
return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1));
|
140
|
+
}
|
141
|
+
template <class Fp, class A0, class A1>
|
142
|
+
inline
|
143
|
+
auto
|
144
|
+
invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
|
145
|
+
-> decltype(((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2)))
|
146
|
+
{
|
147
|
+
return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(a1), boost::forward<Args>(a2));
|
148
|
+
}
|
149
|
+
|
150
|
+
// bullets 3 and 4
|
151
|
+
|
152
|
+
template <class Fp, class A0>
|
153
|
+
inline
|
154
|
+
auto
|
155
|
+
invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
|
156
|
+
-> decltype(boost::forward<A0>(a0).*f)
|
157
|
+
{
|
158
|
+
return boost::forward<A0>(a0).*f;
|
159
|
+
}
|
160
|
+
|
161
|
+
template <class Fp, class A0>
|
162
|
+
inline
|
163
|
+
auto
|
164
|
+
invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A0) a0)
|
165
|
+
-> decltype((*boost::forward<A0>(a0)).*f)
|
166
|
+
{
|
167
|
+
return (*boost::forward<A0>(a0)).*f;
|
168
|
+
}
|
169
|
+
|
170
|
+
// bullet 5
|
171
|
+
|
172
|
+
template <class Fp>
|
173
|
+
inline
|
174
|
+
auto invoke(BOOST_THREAD_RV_REF(Fp) f)
|
175
|
+
-> decltype(boost::forward<Fp>(f)())
|
176
|
+
{
|
177
|
+
return boost::forward<Fp>(f)();
|
178
|
+
}
|
179
|
+
template <class Fp, class A1>
|
180
|
+
inline
|
181
|
+
auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) a1)
|
182
|
+
-> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1)))
|
183
|
+
{
|
184
|
+
return boost::forward<Fp>(f)(boost::forward<A1>(a1));
|
185
|
+
} template <class Fp, class A1, class A2>
|
186
|
+
inline
|
187
|
+
auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
|
188
|
+
-> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2)))
|
189
|
+
{
|
190
|
+
return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
|
191
|
+
}
|
192
|
+
template <class Fp, class A1, class A2, class A3>
|
193
|
+
inline
|
194
|
+
auto invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
|
195
|
+
-> decltype(boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)))
|
196
|
+
{
|
197
|
+
return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
|
198
|
+
}
|
199
|
+
|
200
|
+
#endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES
|
201
|
+
|
202
|
+
#elif ! defined(BOOST_NO_SFINAE_EXPR) && \
|
203
|
+
! defined BOOST_NO_CXX11_HDR_FUNCTIONAL && \
|
204
|
+
defined BOOST_MSVC
|
205
|
+
|
206
|
+
template <class Ret, class Fp>
|
207
|
+
inline
|
208
|
+
Ret invoke(BOOST_THREAD_RV_REF(Fp) f)
|
209
|
+
{
|
210
|
+
return f();
|
211
|
+
}
|
212
|
+
template <class Ret, class Fp, class A1>
|
213
|
+
inline
|
214
|
+
Ret invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
|
215
|
+
{
|
216
|
+
return std::bind(boost::forward<Fp>(f), boost::forward<A1>(a1))();
|
217
|
+
}
|
218
|
+
template <class Ret, class Fp, class A1, class A2>
|
219
|
+
inline
|
220
|
+
Ret invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
|
221
|
+
{
|
222
|
+
return std::bind(boost::forward<Fp>(f), boost::forward<A1>(a1), boost::forward<A2>(a2))();
|
223
|
+
}
|
224
|
+
template <class Ret, class Fp, class A1, class A2, class A3>
|
225
|
+
inline
|
226
|
+
Ret invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
|
227
|
+
{
|
228
|
+
return std::bind(boost::forward<Fp>(f), boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3))();
|
229
|
+
}
|
230
|
+
|
231
|
+
#define BOOST_THREAD_PROVIDES_INVOKE_RET
|
232
|
+
|
233
|
+
#elif ! defined BOOST_MSVC
|
234
|
+
//!!!!! WARNING !!!!! THIS DOESN'T WORKS YET
|
235
|
+
#define BOOST_THREAD_PROVIDES_INVOKE_RET
|
236
|
+
|
237
|
+
#if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
238
|
+
|
239
|
+
// bullet 1
|
240
|
+
// (t1.*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is an object of
|
241
|
+
// type T or a reference to an object of type T or a reference to an object of a type derived from T
|
242
|
+
template <class Ret, class A, class A0, class ...Args>
|
243
|
+
inline
|
244
|
+
typename enable_if_c
|
245
|
+
<
|
246
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
247
|
+
Ret
|
248
|
+
>::type
|
249
|
+
invoke(Ret (A::*f)(Args...), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
|
250
|
+
{
|
251
|
+
return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
|
252
|
+
}
|
253
|
+
|
254
|
+
template <class Ret, class A, class A0, class ...Args>
|
255
|
+
inline
|
256
|
+
typename enable_if_c
|
257
|
+
<
|
258
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
259
|
+
Ret
|
260
|
+
>::type
|
261
|
+
invoke(Ret (A::*f)(Args...) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
|
262
|
+
{
|
263
|
+
return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
|
264
|
+
}
|
265
|
+
|
266
|
+
template <class Ret, class A, class A0, class ...Args>
|
267
|
+
inline
|
268
|
+
typename enable_if_c
|
269
|
+
<
|
270
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
271
|
+
Ret
|
272
|
+
>::type
|
273
|
+
invoke(Ret (A::*f)(Args...) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
|
274
|
+
{
|
275
|
+
return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
|
276
|
+
}
|
277
|
+
|
278
|
+
template <class Ret, class A, class A0, class ...Args>
|
279
|
+
inline
|
280
|
+
typename enable_if_c
|
281
|
+
<
|
282
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
283
|
+
Ret
|
284
|
+
>::type
|
285
|
+
invoke(Ret (A::*f)(Args...) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
|
286
|
+
{
|
287
|
+
return (boost::forward<A0>(a0).*f)(boost::forward<Args>(args)...);
|
288
|
+
}
|
289
|
+
|
290
|
+
// bullet 2
|
291
|
+
// ((*t1).*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is not one of
|
292
|
+
// the types described in the previous item;
|
293
|
+
template <class Ret, class A, class A0, class ...Args>
|
294
|
+
inline
|
295
|
+
typename enable_if_c
|
296
|
+
<
|
297
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
298
|
+
Ret
|
299
|
+
>::type
|
300
|
+
invoke(Ret (A::*f)(Args...), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
|
301
|
+
{
|
302
|
+
return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
|
303
|
+
}
|
304
|
+
|
305
|
+
template <class Ret, class A, class A0, class ...Args>
|
306
|
+
inline
|
307
|
+
typename enable_if_c
|
308
|
+
<
|
309
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
310
|
+
Ret
|
311
|
+
>::type
|
312
|
+
invoke(Ret (A::*f)(Args...) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
|
313
|
+
{
|
314
|
+
return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
|
315
|
+
}
|
316
|
+
|
317
|
+
template <class Ret, class A, class A0, class ...Args>
|
318
|
+
inline
|
319
|
+
typename enable_if_c
|
320
|
+
<
|
321
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
322
|
+
Ret
|
323
|
+
>::type
|
324
|
+
invoke(Ret (A::*f)(Args...) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
|
325
|
+
{
|
326
|
+
return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
|
327
|
+
}
|
328
|
+
|
329
|
+
template <class Ret, class A, class A0, class ...Args>
|
330
|
+
inline
|
331
|
+
typename enable_if_c
|
332
|
+
<
|
333
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
334
|
+
Ret
|
335
|
+
>::type
|
336
|
+
invoke(Ret (A::*f)(Args...) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(Args) ...args)
|
337
|
+
{
|
338
|
+
return ((*boost::forward<A0>(a0)).*f)(boost::forward<Args>(args)...);
|
339
|
+
}
|
340
|
+
|
341
|
+
// bullet 3
|
342
|
+
// t1.*f when N == 1 and f is a pointer to member data of a class T and t1 is an object of type T or a
|
343
|
+
// reference to an object of type T or a reference to an object of a type derived from T;
|
344
|
+
// template <class Ret, class A, class A0>
|
345
|
+
// inline
|
346
|
+
// typename enable_if_c
|
347
|
+
// <
|
348
|
+
// is_base_of<A, typename remove_reference<A0>::type>::value,
|
349
|
+
// typename detail::apply_cv<A0, A>::type&
|
350
|
+
// >::type
|
351
|
+
// invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
|
352
|
+
// {
|
353
|
+
// return boost::forward<A0>(a0).*f;
|
354
|
+
// }
|
355
|
+
|
356
|
+
// bullet 4
|
357
|
+
// (*t1).*f when N == 1 and f is a pointer to member data of a class T and t1 is not one of the types
|
358
|
+
//described in the previous item;
|
359
|
+
|
360
|
+
// template <class A0, class Ret, bool>
|
361
|
+
// struct d4th_helper
|
362
|
+
// {
|
363
|
+
// };
|
364
|
+
//
|
365
|
+
// template <class A0, class Ret>
|
366
|
+
// struct d4th_helper<A0, Ret, true>
|
367
|
+
// {
|
368
|
+
// typedef typename apply_cv<decltype(*declval<A0>()), Ret>::type type;
|
369
|
+
// };
|
370
|
+
//
|
371
|
+
// template <class Ret, class A, class A0>
|
372
|
+
// inline
|
373
|
+
// typename detail::4th_helper<A, Ret,
|
374
|
+
// !is_base_of<A,
|
375
|
+
// typename remove_reference<A0>::type
|
376
|
+
// >::value
|
377
|
+
// >::type&
|
378
|
+
// invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
|
379
|
+
// {
|
380
|
+
// return (*boost::forward<A0>(a0)).*f;
|
381
|
+
// }
|
382
|
+
|
383
|
+
// template <class Ret, class A, class A0>
|
384
|
+
// inline
|
385
|
+
// typename enable_if_c
|
386
|
+
// <
|
387
|
+
// !is_base_of<A, typename remove_reference<A0>::type>::value,
|
388
|
+
// typename detail::ref_return1<Ret A::*, A0>::type
|
389
|
+
// >::type
|
390
|
+
// invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
|
391
|
+
// {
|
392
|
+
// return (*boost::forward<A0>(a0)).*f;
|
393
|
+
// }
|
394
|
+
|
395
|
+
// bullet 5
|
396
|
+
// f(t1, t2, ..., tN) in all other cases.
|
397
|
+
|
398
|
+
template <class Ret, class Fp, class ...Args>
|
399
|
+
inline
|
400
|
+
typename enable_if_c
|
401
|
+
<
|
402
|
+
! is_member_function_pointer<Fp>::value,
|
403
|
+
Ret
|
404
|
+
>::type
|
405
|
+
invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args) ...args)
|
406
|
+
{
|
407
|
+
return boost::forward<Fp>(f)(boost::forward<Args>(args)...);
|
408
|
+
}
|
409
|
+
template <class Ret, class ...Args>
|
410
|
+
inline Ret
|
411
|
+
invoke(Ret(*f)(Args... ), BOOST_THREAD_RV_REF(Args) ...args)
|
412
|
+
{
|
413
|
+
return f(boost::forward<Args>(args)...);
|
414
|
+
}
|
415
|
+
#else // BOOST_NO_CXX11_VARIADIC_TEMPLATES
|
416
|
+
// bullet 1
|
417
|
+
// (t1.*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is an object of
|
418
|
+
// type T or a reference to an object of type T or a reference to an object of a type derived from T
|
419
|
+
|
420
|
+
template <class Ret, class A, class A0>
|
421
|
+
inline
|
422
|
+
typename enable_if_c
|
423
|
+
<
|
424
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
425
|
+
Ret
|
426
|
+
>::type
|
427
|
+
invoke(Ret (A::*f)(), BOOST_THREAD_RV_REF(A0) a0)
|
428
|
+
{
|
429
|
+
return (boost::forward<A0>(a0).*f)();
|
430
|
+
}
|
431
|
+
template <class Ret, class A, class A0, class A1>
|
432
|
+
inline
|
433
|
+
typename enable_if_c
|
434
|
+
<
|
435
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
436
|
+
Ret
|
437
|
+
>::type
|
438
|
+
invoke(Ret (A::*f)(A1), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
|
439
|
+
{
|
440
|
+
return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
|
441
|
+
}
|
442
|
+
template <class Ret, class A, class A0, class A1>
|
443
|
+
inline
|
444
|
+
typename enable_if_c
|
445
|
+
<
|
446
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
447
|
+
Ret
|
448
|
+
>::type
|
449
|
+
invoke(Ret (A::*f)(A1), A0 a0, A1 a1)
|
450
|
+
{
|
451
|
+
return (a0.*f)(a1);
|
452
|
+
}
|
453
|
+
template <class Ret, class A, class A0, class A1, class A2>
|
454
|
+
inline
|
455
|
+
typename enable_if_c
|
456
|
+
<
|
457
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
458
|
+
Ret
|
459
|
+
>::type
|
460
|
+
invoke(Ret (A::*f)(A1, A2),
|
461
|
+
BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2
|
462
|
+
)
|
463
|
+
{
|
464
|
+
return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
|
465
|
+
}
|
466
|
+
template <class Ret, class A, class A0, class A1, class A2>
|
467
|
+
inline
|
468
|
+
typename enable_if_c
|
469
|
+
<
|
470
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
471
|
+
Ret
|
472
|
+
>::type
|
473
|
+
invoke(Ret (A::*f)(A1, A2), A0 a0, A1 a1, A2 a2)
|
474
|
+
{
|
475
|
+
return (a0.*f)(a1, a2);
|
476
|
+
}
|
477
|
+
template <class Ret, class A, class A0, class A1, class A2, class A3>
|
478
|
+
inline
|
479
|
+
typename enable_if_c
|
480
|
+
<
|
481
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
482
|
+
Ret
|
483
|
+
>::type
|
484
|
+
invoke(Ret (A::*f)(A1, A2, A3),
|
485
|
+
BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
|
486
|
+
{
|
487
|
+
return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
|
488
|
+
}
|
489
|
+
template <class Ret, class A, class A0, class A1, class A2, class A3>
|
490
|
+
inline
|
491
|
+
typename enable_if_c
|
492
|
+
<
|
493
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
494
|
+
Ret
|
495
|
+
>::type
|
496
|
+
invoke(Ret (A::*f)(A1, A2, A3), A0 a0, A1 a1, A2 a2, A3 a3)
|
497
|
+
{
|
498
|
+
return (a0.*f)(a1, a2, a3);
|
499
|
+
}
|
500
|
+
|
501
|
+
///
|
502
|
+
template <class Ret, class A, class A0>
|
503
|
+
inline
|
504
|
+
typename enable_if_c
|
505
|
+
<
|
506
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
507
|
+
Ret
|
508
|
+
>::type
|
509
|
+
invoke(Ret (A::*f)() const, BOOST_THREAD_RV_REF(A0) a0)
|
510
|
+
{
|
511
|
+
return (boost::forward<A0>(a0).*f)();
|
512
|
+
}
|
513
|
+
template <class Ret, class A, class A0, class A1>
|
514
|
+
inline
|
515
|
+
typename enable_if_c
|
516
|
+
<
|
517
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
518
|
+
Ret
|
519
|
+
>::type
|
520
|
+
invoke(Ret (A::*f)(A1) const, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
|
521
|
+
{
|
522
|
+
return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
|
523
|
+
}
|
524
|
+
template <class Ret, class A, class A0, class A1>
|
525
|
+
inline
|
526
|
+
typename enable_if_c
|
527
|
+
<
|
528
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
529
|
+
Ret
|
530
|
+
>::type
|
531
|
+
invoke(Ret (A::*f)(A1) const, A0 a0, A1 a1)
|
532
|
+
{
|
533
|
+
return (a0.*f)(a1);
|
534
|
+
}
|
535
|
+
template <class Ret, class A, class A0, class A1, class A2>
|
536
|
+
inline
|
537
|
+
typename enable_if_c
|
538
|
+
<
|
539
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
540
|
+
Ret
|
541
|
+
>::type
|
542
|
+
invoke(Ret (A::*f)(A1, A2) const,
|
543
|
+
BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2
|
544
|
+
)
|
545
|
+
{
|
546
|
+
return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2)
|
547
|
+
);
|
548
|
+
}
|
549
|
+
template <class Ret, class A, class A0, class A1, class A2>
|
550
|
+
inline
|
551
|
+
typename enable_if_c
|
552
|
+
<
|
553
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
554
|
+
Ret
|
555
|
+
>::type
|
556
|
+
invoke(Ret (A::*f)(A1, A2) const, A0 a0, A1 a1, A2 a2)
|
557
|
+
{
|
558
|
+
return (a0.*f)(a1, a2);
|
559
|
+
}
|
560
|
+
template <class Ret, class A, class A0, class A1, class A2, class A3>
|
561
|
+
inline
|
562
|
+
typename enable_if_c
|
563
|
+
<
|
564
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
565
|
+
Ret
|
566
|
+
>::type
|
567
|
+
invoke(Ret (A::*f)(A1, A2, A3) const,
|
568
|
+
BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3
|
569
|
+
)
|
570
|
+
{
|
571
|
+
return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
|
572
|
+
}
|
573
|
+
template <class Ret, class A, class A0, class A1, class A2, class A3>
|
574
|
+
inline
|
575
|
+
typename enable_if_c
|
576
|
+
<
|
577
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
578
|
+
Ret
|
579
|
+
>::type
|
580
|
+
invoke(Ret (A::*f)(A1, A2, A3) const, A0 a0, A1 a1, A2 a2, A3 a3)
|
581
|
+
{
|
582
|
+
return (a0.*f)(a1, a2, a3);
|
583
|
+
}
|
584
|
+
///
|
585
|
+
template <class Ret, class A, class A0>
|
586
|
+
inline
|
587
|
+
typename enable_if_c
|
588
|
+
<
|
589
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
590
|
+
Ret
|
591
|
+
>::type
|
592
|
+
invoke(Ret (A::*f)() volatile, BOOST_THREAD_RV_REF(A0) a0)
|
593
|
+
{
|
594
|
+
return (boost::forward<A0>(a0).*f)();
|
595
|
+
}
|
596
|
+
template <class Ret, class A, class A0, class A1>
|
597
|
+
inline
|
598
|
+
typename enable_if_c
|
599
|
+
<
|
600
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
601
|
+
Ret
|
602
|
+
>::type
|
603
|
+
invoke(Ret (A::*f)(A1) volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
|
604
|
+
{
|
605
|
+
return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
|
606
|
+
}
|
607
|
+
template <class Ret, class A, class A0, class A1>
|
608
|
+
inline
|
609
|
+
typename enable_if_c
|
610
|
+
<
|
611
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
612
|
+
Ret
|
613
|
+
>::type
|
614
|
+
invoke(Ret (A::*f)(A1) volatile, A0 a0, A1 a1)
|
615
|
+
{
|
616
|
+
return (a0.*f)(a1);
|
617
|
+
}
|
618
|
+
template <class Ret, class A, class A0, class A1, class A2>
|
619
|
+
inline
|
620
|
+
typename enable_if_c
|
621
|
+
<
|
622
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
623
|
+
Ret
|
624
|
+
>::type
|
625
|
+
invoke(Ret (A::*f)(A1, A2) volatile,
|
626
|
+
BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
|
627
|
+
{
|
628
|
+
return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
|
629
|
+
}
|
630
|
+
template <class Ret, class A, class A0, class A1, class A2>
|
631
|
+
inline
|
632
|
+
typename enable_if_c
|
633
|
+
<
|
634
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
635
|
+
Ret
|
636
|
+
>::type
|
637
|
+
invoke(Ret (A::*f)(A1, A2) volatile, A0 a0, A1 a1, A2 a2 )
|
638
|
+
{
|
639
|
+
return (a0.*f)(a1, a2);
|
640
|
+
}
|
641
|
+
template <class Ret, class A, class A0, class A1, class A2, class A3>
|
642
|
+
inline
|
643
|
+
typename enable_if_c
|
644
|
+
<
|
645
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
646
|
+
Ret
|
647
|
+
>::type
|
648
|
+
invoke(Ret (A::*f)(A1, A2, A3) volatile,
|
649
|
+
BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3
|
650
|
+
)
|
651
|
+
{
|
652
|
+
return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
|
653
|
+
}
|
654
|
+
template <class Ret, class A, class A0, class A1, class A2, class A3>
|
655
|
+
inline
|
656
|
+
typename enable_if_c
|
657
|
+
<
|
658
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
659
|
+
Ret
|
660
|
+
>::type
|
661
|
+
invoke(Ret (A::*f)(A1, A2, A3) volatile, A0 a0, A1 a1, A2 a2, A3 a3)
|
662
|
+
{
|
663
|
+
return (a0.*f)(a1, a2, a3);
|
664
|
+
}
|
665
|
+
///
|
666
|
+
template <class Ret, class A, class A0>
|
667
|
+
inline
|
668
|
+
typename enable_if_c
|
669
|
+
<
|
670
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
671
|
+
Ret
|
672
|
+
>::type
|
673
|
+
invoke(Ret (A::*f)() const volatile, BOOST_THREAD_RV_REF(A0) a0)
|
674
|
+
{
|
675
|
+
return (boost::forward<A0>(a0).*f)();
|
676
|
+
}
|
677
|
+
template <class Ret, class A, class A0, class A1>
|
678
|
+
inline
|
679
|
+
typename enable_if_c
|
680
|
+
<
|
681
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
682
|
+
Ret
|
683
|
+
>::type
|
684
|
+
invoke(Ret (A::*f)(A1) const volatile, BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
|
685
|
+
{
|
686
|
+
return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1));
|
687
|
+
}
|
688
|
+
template <class Ret, class A, class A0, class A1>
|
689
|
+
inline
|
690
|
+
typename enable_if_c
|
691
|
+
<
|
692
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
693
|
+
Ret
|
694
|
+
>::type
|
695
|
+
invoke(Ret (A::*f)(A1) const volatile, A0 a0, A1 a1)
|
696
|
+
{
|
697
|
+
return (a0.*f)(a1);
|
698
|
+
}
|
699
|
+
template <class Ret, class A, class A0, class A1, class A2>
|
700
|
+
inline
|
701
|
+
typename enable_if_c
|
702
|
+
<
|
703
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
704
|
+
Ret
|
705
|
+
>::type
|
706
|
+
invoke(Ret (A::*f)(A1, A2) const volatile,
|
707
|
+
BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2
|
708
|
+
)
|
709
|
+
{
|
710
|
+
return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
|
711
|
+
}
|
712
|
+
template <class Ret, class A, class A0, class A1, class A2>
|
713
|
+
inline
|
714
|
+
typename enable_if_c
|
715
|
+
<
|
716
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
717
|
+
Ret
|
718
|
+
>::type
|
719
|
+
invoke(Ret (A::*f)(A1, A2) const volatile,
|
720
|
+
A0 a0, A1 a1, A2 a2
|
721
|
+
)
|
722
|
+
{
|
723
|
+
return (a0.*f)(a1, a2);
|
724
|
+
}
|
725
|
+
template <class Ret, class A, class A0, class A1, class A2, class A3>
|
726
|
+
inline
|
727
|
+
typename enable_if_c
|
728
|
+
<
|
729
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
730
|
+
Ret
|
731
|
+
>::type
|
732
|
+
invoke(Ret (A::*f)(A1, A2, A3) const volatile,
|
733
|
+
BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3
|
734
|
+
)
|
735
|
+
{
|
736
|
+
return (boost::forward<A0>(a0).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
|
737
|
+
}
|
738
|
+
template <class Ret, class A, class A0, class A1, class A2, class A3>
|
739
|
+
inline
|
740
|
+
typename enable_if_c
|
741
|
+
<
|
742
|
+
is_base_of<A, typename remove_reference<A0>::type>::value,
|
743
|
+
Ret
|
744
|
+
>::type
|
745
|
+
invoke(Ret (A::*f)(A1, A2, A3) const volatile,
|
746
|
+
A0 a0, A1 a1, A2 a2, A3 a3
|
747
|
+
)
|
748
|
+
{
|
749
|
+
return (a0.*f)(a1, a2, a3);
|
750
|
+
}
|
751
|
+
|
752
|
+
// bullet 2
|
753
|
+
// ((*t1).*f)(t2, ..., tN) when f is a pointer to a member function of a class T and t1 is not one of
|
754
|
+
// the types described in the previous item;
|
755
|
+
template <class Ret, class A, class A0>
|
756
|
+
inline
|
757
|
+
typename enable_if_c
|
758
|
+
<
|
759
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
760
|
+
Ret
|
761
|
+
>::type
|
762
|
+
invoke(Ret (A::*f)(), BOOST_THREAD_RV_REF(A0) a0)
|
763
|
+
{
|
764
|
+
return ((*boost::forward<A0>(a0)).*f)();
|
765
|
+
}
|
766
|
+
template <class Ret, class A, class A0, class A1>
|
767
|
+
inline
|
768
|
+
typename enable_if_c
|
769
|
+
<
|
770
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
771
|
+
Ret
|
772
|
+
>::type
|
773
|
+
invoke(Ret (A::*f)(A1), BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
|
774
|
+
{
|
775
|
+
return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
|
776
|
+
}
|
777
|
+
template <class Ret, class A, class A0, class A1>
|
778
|
+
inline
|
779
|
+
typename enable_if_c
|
780
|
+
<
|
781
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
782
|
+
Ret
|
783
|
+
>::type
|
784
|
+
invoke(Ret (A::*f)(A1), A0 a0, A1 a1)
|
785
|
+
{
|
786
|
+
return ((*a0).*f)(a1);
|
787
|
+
}
|
788
|
+
template <class Ret, class A, class A0, class A1, class A2>
|
789
|
+
inline
|
790
|
+
typename enable_if_c
|
791
|
+
<
|
792
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
793
|
+
Ret
|
794
|
+
>::type
|
795
|
+
invoke(Ret (A::*f)(A1, BOOST_THREAD_RV_REF(A2)),
|
796
|
+
BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
|
797
|
+
{
|
798
|
+
return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
|
799
|
+
}
|
800
|
+
template <class Ret, class A, class A0, class A1, class A2>
|
801
|
+
inline
|
802
|
+
typename enable_if_c
|
803
|
+
<
|
804
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
805
|
+
Ret
|
806
|
+
>::type
|
807
|
+
invoke(Ret (A::*f)(A1, A2), A0 a0, A1 a1, A2 a2)
|
808
|
+
{
|
809
|
+
return ((*a0).*f)(a1, a2);
|
810
|
+
}
|
811
|
+
template <class Ret, class A, class A0, class A1, class A2, class A3>
|
812
|
+
inline
|
813
|
+
typename enable_if_c
|
814
|
+
<
|
815
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
816
|
+
Ret
|
817
|
+
>::type
|
818
|
+
invoke(Ret (A::*f)(A1, BOOST_THREAD_RV_REF(A2), BOOST_THREAD_RV_REF(A3)),
|
819
|
+
BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
|
820
|
+
{
|
821
|
+
return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)
|
822
|
+
);
|
823
|
+
}
|
824
|
+
template <class Ret, class A, class A0, class A1, class A2, class A3>
|
825
|
+
inline
|
826
|
+
typename enable_if_c
|
827
|
+
<
|
828
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
829
|
+
Ret
|
830
|
+
>::type
|
831
|
+
invoke(Ret (A::*f)(A1, A2, A3), A0 a0, A1 a1, A2 a2, A3 a3)
|
832
|
+
{
|
833
|
+
return ((*a0).*f)(a1, a2, a3);
|
834
|
+
}
|
835
|
+
|
836
|
+
///
|
837
|
+
template <class Ret, class A, class A0>
|
838
|
+
inline
|
839
|
+
typename enable_if_c
|
840
|
+
<
|
841
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
842
|
+
Ret
|
843
|
+
>::type
|
844
|
+
invoke(Ret (A::*f)() const, BOOST_THREAD_RV_REF(A0) a0)
|
845
|
+
{
|
846
|
+
return ((*boost::forward<A0>(a0)).*f)();
|
847
|
+
}
|
848
|
+
template <class Ret, class A, class A0, class A1>
|
849
|
+
inline
|
850
|
+
typename enable_if_c
|
851
|
+
<
|
852
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
853
|
+
Ret
|
854
|
+
>::type
|
855
|
+
invoke(Ret (A::*f)(A1) const,
|
856
|
+
BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
|
857
|
+
{
|
858
|
+
return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
|
859
|
+
}
|
860
|
+
template <class Ret, class A, class A0, class A1>
|
861
|
+
inline
|
862
|
+
typename enable_if_c
|
863
|
+
<
|
864
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
865
|
+
Ret
|
866
|
+
>::type
|
867
|
+
invoke(Ret (A::*f)(A1) const, BOOST_THREAD_RV_REF(A0) a0, A1 a1)
|
868
|
+
{
|
869
|
+
return ((*boost::forward<A0>(a0)).*f)(a1);
|
870
|
+
}
|
871
|
+
template <class Ret, class A, class A0, class A1>
|
872
|
+
inline
|
873
|
+
typename enable_if_c
|
874
|
+
<
|
875
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
876
|
+
Ret
|
877
|
+
>::type
|
878
|
+
invoke(Ret (A::*f)(A1) const, A0 a0, A1 a1)
|
879
|
+
{
|
880
|
+
return ((*a0).*f)(a1);
|
881
|
+
}
|
882
|
+
template <class Ret, class A, class A0, class A1, class A2>
|
883
|
+
inline
|
884
|
+
typename enable_if_c
|
885
|
+
<
|
886
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
887
|
+
Ret
|
888
|
+
>::type
|
889
|
+
invoke(Ret (A::*f)(A1, A2) const,
|
890
|
+
BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
|
891
|
+
{
|
892
|
+
return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
|
893
|
+
}
|
894
|
+
template <class Ret, class A, class A0, class A1, class A2>
|
895
|
+
inline
|
896
|
+
typename enable_if_c
|
897
|
+
<
|
898
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
899
|
+
Ret
|
900
|
+
>::type
|
901
|
+
invoke(Ret (A::*f)(A1, A2) const, A0 a0, A1 a1, A2 a2)
|
902
|
+
{
|
903
|
+
return ((*a0).*f)(a1, a2);
|
904
|
+
}
|
905
|
+
template <class Ret, class A, class A0, class A1, class A2, class A3>
|
906
|
+
inline
|
907
|
+
typename enable_if_c
|
908
|
+
<
|
909
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
910
|
+
Ret
|
911
|
+
>::type
|
912
|
+
invoke(Ret (A::*f)(A1, A2, A3) const,
|
913
|
+
BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
|
914
|
+
{
|
915
|
+
return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
|
916
|
+
}
|
917
|
+
template <class Ret, class A, class A0, class A1, class A2, class A3>
|
918
|
+
inline
|
919
|
+
typename enable_if_c
|
920
|
+
<
|
921
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
922
|
+
Ret
|
923
|
+
>::type
|
924
|
+
invoke(Ret (A::*f)(A1, A2, A3) const,
|
925
|
+
A0 a0, A1 a1, A2 a2, A3 a3)
|
926
|
+
{
|
927
|
+
return ((*a0).*f)(a1, a2, a3);
|
928
|
+
}
|
929
|
+
///
|
930
|
+
template <class Ret, class A, class A0>
|
931
|
+
inline
|
932
|
+
typename enable_if_c
|
933
|
+
<
|
934
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
935
|
+
Ret
|
936
|
+
>::type
|
937
|
+
invoke(Ret (A::*f)() volatile, BOOST_THREAD_RV_REF(A0) a0)
|
938
|
+
{
|
939
|
+
return ((*boost::forward<A0>(a0)).*f)();
|
940
|
+
}
|
941
|
+
template <class Ret, class A, class A0, class A1>
|
942
|
+
inline
|
943
|
+
typename enable_if_c
|
944
|
+
<
|
945
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
946
|
+
Ret
|
947
|
+
>::type
|
948
|
+
invoke(Ret (A::*f)(A1) volatile,
|
949
|
+
BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
|
950
|
+
{
|
951
|
+
return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
|
952
|
+
}
|
953
|
+
template <class Ret, class A, class A0, class A1>
|
954
|
+
inline
|
955
|
+
typename enable_if_c
|
956
|
+
<
|
957
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
958
|
+
Ret
|
959
|
+
>::type
|
960
|
+
invoke(Ret (A::*f)(A1) volatile, A0 a0, A1 a1)
|
961
|
+
{
|
962
|
+
return ((*a0).*f)(a1);
|
963
|
+
}
|
964
|
+
template <class Ret, class A, class A0, class A1, class A2>
|
965
|
+
inline
|
966
|
+
typename enable_if_c
|
967
|
+
<
|
968
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
969
|
+
Ret
|
970
|
+
>::type
|
971
|
+
invoke(Ret (A::*f)(A1, A2) volatile,
|
972
|
+
BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
|
973
|
+
{
|
974
|
+
return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
|
975
|
+
}
|
976
|
+
template <class Ret, class A, class A0, class A1, class A2>
|
977
|
+
inline
|
978
|
+
typename enable_if_c
|
979
|
+
<
|
980
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
981
|
+
Ret
|
982
|
+
>::type
|
983
|
+
invoke(Ret (A::*f)(A1, A2) volatile, A0 a0, A1 a1, A2 a2)
|
984
|
+
{
|
985
|
+
return ((*a0).*f)(a1, a2);
|
986
|
+
}
|
987
|
+
template <class Ret, class A, class A0, class A1, class A2, class A3>
|
988
|
+
inline
|
989
|
+
typename enable_if_c
|
990
|
+
<
|
991
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
992
|
+
Ret
|
993
|
+
>::type
|
994
|
+
invoke(Ret (A::*f)(A1, A2, A3) volatile,
|
995
|
+
BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
|
996
|
+
{
|
997
|
+
return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
|
998
|
+
}
|
999
|
+
template <class Ret, class A, class A0, class A1, class A2, class A3>
|
1000
|
+
inline
|
1001
|
+
typename enable_if_c
|
1002
|
+
<
|
1003
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
1004
|
+
Ret
|
1005
|
+
>::type
|
1006
|
+
invoke(Ret (A::*f)(A1, A2, A3) volatile, A0 a0, A1 a1, A2 a2, A3 a3)
|
1007
|
+
{
|
1008
|
+
return ((*a0).*f)(a1, a2, a3);
|
1009
|
+
}
|
1010
|
+
///
|
1011
|
+
template <class Ret, class A, class A0>
|
1012
|
+
inline
|
1013
|
+
typename enable_if_c
|
1014
|
+
<
|
1015
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
1016
|
+
Ret
|
1017
|
+
>::type
|
1018
|
+
invoke(Ret (A::*f)() const volatile, BOOST_THREAD_RV_REF(A0) a0)
|
1019
|
+
{
|
1020
|
+
return ((*boost::forward<A0>(a0)).*f)();
|
1021
|
+
}
|
1022
|
+
template <class Ret, class A, class A0>
|
1023
|
+
inline
|
1024
|
+
typename enable_if_c
|
1025
|
+
<
|
1026
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
1027
|
+
Ret
|
1028
|
+
>::type
|
1029
|
+
invoke(Ret (A::*f)() const volatile, A0 a0)
|
1030
|
+
{
|
1031
|
+
return ((*a0).*f)();
|
1032
|
+
}
|
1033
|
+
template <class Ret, class A, class A0, class A1>
|
1034
|
+
inline
|
1035
|
+
typename enable_if_c
|
1036
|
+
<
|
1037
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
1038
|
+
Ret
|
1039
|
+
>::type
|
1040
|
+
invoke(Ret (A::*f)(A1) const volatile,
|
1041
|
+
BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1)
|
1042
|
+
{
|
1043
|
+
return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1));
|
1044
|
+
}
|
1045
|
+
template <class Ret, class A, class A0, class A1>
|
1046
|
+
inline
|
1047
|
+
typename enable_if_c
|
1048
|
+
<
|
1049
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
1050
|
+
Ret
|
1051
|
+
>::type
|
1052
|
+
invoke(Ret (A::*f)(A1) const volatile, A0 a0, A1 a1)
|
1053
|
+
{
|
1054
|
+
return ((*a0).*f)(a1);
|
1055
|
+
}
|
1056
|
+
template <class Ret, class A, class A0, class A1, class A2>
|
1057
|
+
inline
|
1058
|
+
typename enable_if_c
|
1059
|
+
<
|
1060
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
1061
|
+
Ret
|
1062
|
+
>::type
|
1063
|
+
invoke(Ret (A::*f)(A1, A2) const volatile,
|
1064
|
+
BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
|
1065
|
+
{
|
1066
|
+
return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
|
1067
|
+
}
|
1068
|
+
template <class Ret, class A, class A0, class A1, class A2>
|
1069
|
+
inline
|
1070
|
+
typename enable_if_c
|
1071
|
+
<
|
1072
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
1073
|
+
Ret
|
1074
|
+
>::type
|
1075
|
+
invoke(Ret (A::*f)(A1, A2) const volatile,
|
1076
|
+
A0 a0, A1 a1, A2 a2)
|
1077
|
+
{
|
1078
|
+
return ((*a0).*f)(a1, a2);
|
1079
|
+
}
|
1080
|
+
template <class Ret, class A, class A0, class A1, class A2, class A3>
|
1081
|
+
inline
|
1082
|
+
typename enable_if_c
|
1083
|
+
<
|
1084
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
1085
|
+
Ret
|
1086
|
+
>::type
|
1087
|
+
invoke(Ret (A::*f)(A1, A2, A3) const volatile,
|
1088
|
+
BOOST_THREAD_RV_REF(A0) a0, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
|
1089
|
+
{
|
1090
|
+
return ((*boost::forward<A0>(a0)).*f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
|
1091
|
+
}
|
1092
|
+
template <class Ret, class A, class A0, class A1, class A2, class A3>
|
1093
|
+
inline
|
1094
|
+
typename enable_if_c
|
1095
|
+
<
|
1096
|
+
! is_base_of<A, typename remove_reference<A0>::type>::value,
|
1097
|
+
Ret
|
1098
|
+
>::type
|
1099
|
+
invoke(Ret (A::*f)(A1, A2, A3) const volatile,
|
1100
|
+
A0 a0, A1 a1, A2 a2, A3 a3)
|
1101
|
+
{
|
1102
|
+
return ((*a0).*f)(a1, a2, a3);
|
1103
|
+
}
|
1104
|
+
// bullet 3
|
1105
|
+
// t1.*f when N == 1 and f is a pointer to member data of a class T and t1 is an object of type T or a
|
1106
|
+
// reference to an object of type T or a reference to an object of a type derived from T;
|
1107
|
+
// template <class Ret, class A, class A0>
|
1108
|
+
// inline
|
1109
|
+
// typename enable_if_c
|
1110
|
+
// <
|
1111
|
+
// is_base_of<A, typename remove_reference<A0>::type>::value,
|
1112
|
+
// typename detail::apply_cv<A0, A>::type&
|
1113
|
+
// >::type
|
1114
|
+
// invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
|
1115
|
+
// {
|
1116
|
+
// return boost::forward<A0>(a0).*f;
|
1117
|
+
// }
|
1118
|
+
|
1119
|
+
// bullet 4
|
1120
|
+
// (*t1).*f when N == 1 and f is a pointer to member data of a class T and t1 is not one of the types
|
1121
|
+
//described in the previous item;
|
1122
|
+
|
1123
|
+
// template <class A0, class Ret, bool>
|
1124
|
+
// struct d4th_helper
|
1125
|
+
// {
|
1126
|
+
// };
|
1127
|
+
//
|
1128
|
+
// template <class A0, class Ret>
|
1129
|
+
// struct d4th_helper<A0, Ret, true>
|
1130
|
+
// {
|
1131
|
+
// typedef typename apply_cv<decltype(*declval<A0>()), Ret>::type type;
|
1132
|
+
// };
|
1133
|
+
//
|
1134
|
+
// template <class Ret, class A, class A0>
|
1135
|
+
// inline
|
1136
|
+
// typename detail::4th_helper<A, Ret,
|
1137
|
+
// !is_base_of<A,
|
1138
|
+
// typename remove_reference<A0>::type
|
1139
|
+
// >::value
|
1140
|
+
// >::type&
|
1141
|
+
// invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
|
1142
|
+
// {
|
1143
|
+
// return (*boost::forward<A0>(a0)).*f;
|
1144
|
+
// }
|
1145
|
+
|
1146
|
+
// template <class Ret, class A, class A0>
|
1147
|
+
// inline
|
1148
|
+
// typename enable_if_c
|
1149
|
+
// <
|
1150
|
+
// !is_base_of<A, typename remove_reference<A0>::type>::value,
|
1151
|
+
// typename detail::ref_return1<Ret A::*, A0>::type
|
1152
|
+
// >::type
|
1153
|
+
// invoke(Ret A::* f, BOOST_THREAD_RV_REF(A0) a0)
|
1154
|
+
// {
|
1155
|
+
// return (*boost::forward<A0>(a0)).*f;
|
1156
|
+
// }
|
1157
|
+
|
1158
|
+
// bullet 5
|
1159
|
+
// f(t1, t2, ..., tN) in all other cases.
|
1160
|
+
|
1161
|
+
template <class Ret, class Fp>
|
1162
|
+
inline
|
1163
|
+
typename enable_if_c
|
1164
|
+
<
|
1165
|
+
! is_member_function_pointer<Fp>::value,
|
1166
|
+
Ret
|
1167
|
+
>::type
|
1168
|
+
invoke(BOOST_THREAD_RV_REF(Fp) f)
|
1169
|
+
{
|
1170
|
+
return boost::forward<Fp>(f)();
|
1171
|
+
}
|
1172
|
+
template <class Ret, class Fp, class A1>
|
1173
|
+
inline
|
1174
|
+
typename enable_if_c
|
1175
|
+
<
|
1176
|
+
! is_member_function_pointer<Fp>::value,
|
1177
|
+
Ret
|
1178
|
+
>::type
|
1179
|
+
invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1)
|
1180
|
+
{
|
1181
|
+
return boost::forward<Fp>(f)(boost::forward<A1>(a1));
|
1182
|
+
}
|
1183
|
+
template <class Ret, class Fp, class A1>
|
1184
|
+
inline
|
1185
|
+
typename enable_if_c
|
1186
|
+
<
|
1187
|
+
! is_member_function_pointer<Fp>::value,
|
1188
|
+
Ret
|
1189
|
+
>::type
|
1190
|
+
invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1)
|
1191
|
+
{
|
1192
|
+
return boost::forward<Fp>(f)(a1);
|
1193
|
+
}
|
1194
|
+
template <class Ret, class Fp, class A1, class A2>
|
1195
|
+
inline
|
1196
|
+
typename enable_if_c
|
1197
|
+
<
|
1198
|
+
! is_member_function_pointer<Fp>::value,
|
1199
|
+
Ret
|
1200
|
+
>::type
|
1201
|
+
invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
|
1202
|
+
{
|
1203
|
+
return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2));
|
1204
|
+
}
|
1205
|
+
template <class Ret, class Fp, class A1, class A2>
|
1206
|
+
inline
|
1207
|
+
typename enable_if_c
|
1208
|
+
<
|
1209
|
+
! is_member_function_pointer<Fp>::value,
|
1210
|
+
Ret
|
1211
|
+
>::type
|
1212
|
+
invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1, A2 a2)
|
1213
|
+
{
|
1214
|
+
return boost::forward<Fp>(f)(a1, a2);
|
1215
|
+
}
|
1216
|
+
template <class Ret, class Fp, class A1, class A2, class A3>
|
1217
|
+
inline
|
1218
|
+
typename enable_if_c
|
1219
|
+
<
|
1220
|
+
! is_member_function_pointer<Fp>::value,
|
1221
|
+
Ret
|
1222
|
+
>::type
|
1223
|
+
invoke(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
|
1224
|
+
{
|
1225
|
+
return boost::forward<Fp>(f)(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
|
1226
|
+
}
|
1227
|
+
template <class Ret, class Fp, class A1, class A2, class A3>
|
1228
|
+
inline
|
1229
|
+
typename enable_if_c
|
1230
|
+
<
|
1231
|
+
! is_member_function_pointer<Fp>::value,
|
1232
|
+
Ret
|
1233
|
+
>::type
|
1234
|
+
invoke(BOOST_THREAD_RV_REF(Fp) f, A1 a1, A2 a2, A3 a3)
|
1235
|
+
{
|
1236
|
+
return boost::forward<Fp>(f)(a1, a2, a3);
|
1237
|
+
}
|
1238
|
+
|
1239
|
+
///
|
1240
|
+
template <class Ret, class Fp>
|
1241
|
+
inline
|
1242
|
+
typename enable_if_c
|
1243
|
+
<
|
1244
|
+
! is_member_function_pointer<Fp>::value,
|
1245
|
+
Ret
|
1246
|
+
>::type
|
1247
|
+
invoke(Fp const &f)
|
1248
|
+
{
|
1249
|
+
return f();
|
1250
|
+
}
|
1251
|
+
template <class Ret, class Fp, class A1>
|
1252
|
+
inline
|
1253
|
+
typename enable_if_c
|
1254
|
+
<
|
1255
|
+
! is_member_function_pointer<Fp>::value,
|
1256
|
+
Ret
|
1257
|
+
>::type
|
1258
|
+
invoke(Fp const &f, BOOST_THREAD_RV_REF(A1) a1)
|
1259
|
+
{
|
1260
|
+
return f(boost::forward<A1>(a1));
|
1261
|
+
}
|
1262
|
+
template <class Ret, class Fp, class A1>
|
1263
|
+
inline
|
1264
|
+
typename enable_if_c
|
1265
|
+
<
|
1266
|
+
! is_member_function_pointer<Fp>::value,
|
1267
|
+
Ret
|
1268
|
+
>::type
|
1269
|
+
invoke(Fp const &f, A1 a1)
|
1270
|
+
{
|
1271
|
+
return f(a1);
|
1272
|
+
}
|
1273
|
+
template <class Ret, class Fp, class A1, class A2>
|
1274
|
+
inline
|
1275
|
+
typename enable_if_c
|
1276
|
+
<
|
1277
|
+
! is_member_function_pointer<Fp>::value,
|
1278
|
+
Ret
|
1279
|
+
>::type
|
1280
|
+
invoke(Fp const &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
|
1281
|
+
{
|
1282
|
+
return f(boost::forward<A1>(a1), boost::forward<A2>(a2));
|
1283
|
+
}
|
1284
|
+
template <class Ret, class Fp, class A1, class A2>
|
1285
|
+
inline
|
1286
|
+
typename enable_if_c
|
1287
|
+
<
|
1288
|
+
! is_member_function_pointer<Fp>::value,
|
1289
|
+
Ret
|
1290
|
+
>::type
|
1291
|
+
invoke(Fp const &f, A1 a1, A2 a2)
|
1292
|
+
{
|
1293
|
+
return f(a1, a2);
|
1294
|
+
}
|
1295
|
+
template <class Ret, class Fp, class A1, class A2, class A3>
|
1296
|
+
inline
|
1297
|
+
typename enable_if_c
|
1298
|
+
<
|
1299
|
+
! is_member_function_pointer<Fp>::value,
|
1300
|
+
Ret
|
1301
|
+
>::type
|
1302
|
+
invoke(Fp const &f, BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
|
1303
|
+
{
|
1304
|
+
return f(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
|
1305
|
+
}
|
1306
|
+
template <class Ret, class Fp, class A1, class A2, class A3>
|
1307
|
+
inline
|
1308
|
+
typename enable_if_c
|
1309
|
+
<
|
1310
|
+
! is_member_function_pointer<Fp>::value,
|
1311
|
+
Ret
|
1312
|
+
>::type
|
1313
|
+
invoke(Fp const &f, A1 a1, A2 a2, A3 a3)
|
1314
|
+
{
|
1315
|
+
return f(a1, a2, a3);
|
1316
|
+
}
|
1317
|
+
///
|
1318
|
+
|
1319
|
+
template <class Ret>
|
1320
|
+
inline Ret
|
1321
|
+
invoke(Ret(*f)())
|
1322
|
+
{
|
1323
|
+
return f();
|
1324
|
+
}
|
1325
|
+
template <class Ret, class A1>
|
1326
|
+
inline Ret
|
1327
|
+
invoke(Ret(*f)(A1), BOOST_THREAD_RV_REF(A1) a1)
|
1328
|
+
{
|
1329
|
+
return f(boost::forward<A1>(a1));
|
1330
|
+
}
|
1331
|
+
template <class Ret, class A1, class A2>
|
1332
|
+
inline Ret
|
1333
|
+
invoke(Ret(*f)(A1, A2),
|
1334
|
+
BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2)
|
1335
|
+
{
|
1336
|
+
return f(boost::forward<A1>(a1), boost::forward<A2>(a2));
|
1337
|
+
}
|
1338
|
+
template <class Ret, class A1, class A2, class A3>
|
1339
|
+
inline Ret
|
1340
|
+
invoke(Ret(*f)(A1, A2, A3),
|
1341
|
+
BOOST_THREAD_RV_REF(A1) a1, BOOST_THREAD_RV_REF(A2) a2, BOOST_THREAD_RV_REF(A3) a3)
|
1342
|
+
{
|
1343
|
+
return f(boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3));
|
1344
|
+
}
|
1345
|
+
#endif // BOOST_NO_CXX11_VARIADIC_TEMPLATES
|
1346
|
+
|
1347
|
+
#endif // all
|
1348
|
+
}
|
1349
|
+
}
|
1350
|
+
|
1351
|
+
#endif // header
|